- 使用 HashMap 对出现次数进行统计
public int FirstNotRepeatingChar(String str) {
if(str==null || str.length()==0)
return -1;
Map<Character, Integer> map = new HashMap<>();
for(int i=0; i<str.length(); i++){
char c = str.charAt(i);
if(map.containsKey(c)){
map.put(c, map.get(c)+1);
}else{
map.put(c, 1);
}
}
for(int i=0; i<str.length(); i++){
if(map.get(str.charAt(i)) == 1)
return i;
}
return -1;
}
- 考虑到要统计的字符范围有限,因此可以使用整型数组代替 HashMap
public int FirstNotRepeatingChar(String str) {
if(str==null || str.length()==0)
return -1;
int[] cnt = new int[256];
for(int i=0; i<str.length(); i++){
cnt[str.charAt(i)]++;
}
for(int i=0; i<str.length(); i++){
if(cnt[str.charAt(i)] == 1)
return i;
}
return -1;
}
- 以上实现的空间复杂度还不是最优的。考虑到只需要找到只出现一次的字符,那么需要统计的次数信息只有 0,1,更大,使用两个比特位就能存储这些信息
public int FirstNotRepeatingChar(String str) {
if(str==null || str.length()==0)
return -1;
BitSet bs1 = new BitSet(256);
BitSet bs2 = new BitSet(256);
for(char c : str.toCharArray()){
if(!bs1.get(c) && !bs2.get(c))
bs1.set(c);
else if(bs1.get(c) && !bs2.get(c))
bs2.set(c);
}
for(int i=0; i<str.length(); i++){
char c = str.charAt(i);
if(bs1.get(c) && !bs2.get(c))
return i;
}
return -1;
}