用Hash做,维护了两个HashMap,一个用来放第一次的位置,一个用来辅助判断此字母是否重复。但是我这里不更新每一个字母的出现次数,只要出现一次重复当即删除储存索引值的整个Key 所以开销可能也没有那么大。

public int FirstNotRepeatingChar(String str) {
if(str.length()==0)return -1;
if(str.length()==1)return str.charAt(0);
char[] strchar = str.toCharArray();
HashMap<Character,Integer> map1 = new HashMap<>();//记录索引
HashMap<Character,Integer> map2 = new HashMap<>();//记录出现个数
for(int i=0;i<strchar.length;i++) {
if(!map1.containsKey(strchar[i])&&!map2.containsKey(strchar[i])){
map1.put(strchar[i], i);
map2.put(strchar[i], 1);
}else if(map1.containsKey(strchar[i])) {
map1.remove(strchar[i]);
}
}
if(map1.isEmpty()) return -1;
for(int i=0;i<strchar.length;i++) {
if(map1.containsValue(i))return i;
}
return -1;
}