思路:

从题中给出的有效信息有两点:

  • 找到第一个只出现一次的字符
  • 区分大小写,从0开始计数

由于哈希函数对于hash值的算法的速度比较快,故此此字符串可以通过哈希数组来进行解答

方法一:哈希数组

具体做法:
先将数据存入哈希数组中,判断存在就存 -1, 不存在就存当前下标,再通过哈希数组遍历找到最小的下标返回即可,具体过程如下图所示
图片说明

import java.util.HashMap;
import java.util.Map;
public class Solution {
    public int FirstNotRepeatingChar(String str) {
        char[] c = str.toCharArray();
        Map<Character,Integer> hm = new HashMap<Character,Integer>();
        for (int i = 0; i < c.length; i++) {
            //存在则放入,反之不放
            if(hm.containsKey(c[i])){ 
                hm.put(c[i],-1);
            }else{
                hm.put(c[i],i);
            }
        }
        int firstIndex = c.length; char firstChar = ' ';
        for (Map.Entry<Character,Integer> mn : hm.entrySet()) {
            //遍历返回 大于 -1 且 第一个出现的字符
            if(mn.getValue() > -1 && firstIndex > mn.getValue()){
                firstIndex = mn.getValue();
                firstChar = mn.getKey();
            }
        }
        return firstIndex == c.length ? -1 : firstIndex;
    }
}

复杂度分析:

  • 时间复杂度:O(n),遍历了两次,常数省略
  • 空间复杂度:O(n) ,申请了常数的char数组空间

方法二:遍历n次字符串

具体做法:
遍历n次字符串,用 flag 标记当前是否为第一个出现的第一个

public class Solution {
    public int FirstNotRepeatingChar(String str) {
        int len=str.length();
        int flag=0;//记录当前字符是否唯一
        for (int i = 0; i < len; i++) {
            for (int j =0; j < len; j++) {
                //j = i 跳过本次循环
                if(j==i) continue;
                //找到相同字符则退出循环,没有则继续遍历,直至循环结束
                if(str.charAt(i)==str.charAt(j)){
                    flag=1;
                    break;
                }
                if(str.charAt(i)!=str.charAt(j)){
                    flag=0;
                }
            }
            if(flag==0)
                return i;
        }
        return -1;
    }
}

复杂度分析:

  • 时间复杂度:O(n^2) 遍历n次字符串,时间复杂度为n^2,n为字符串长度
  • 空间复杂度:O(1) 未申请额外的空间