解题思路
哈希表
这道题最优的解法就是线性复杂度了,为了保证每个元素是唯一的,至少得把每个字符都遍历一遍。
算法的思路就是遍历一遍字符串,然后把字符串中每个字符出现的次数保存在一个散列表中。这个过程的时间复杂度为 O(N),其中 N 为字符串的长度。
接下来需要再遍历一次字符串,这一次利用散列表来检查遍历的每个字符是不是唯一的。如果当前字符唯一,直接返回当前下标就可以了。第二次遍历的时间复杂度也是 O(N)。
public int firstUniqChar(String s) {
HashMap<Character,Integer> res = new HashMap<>();
int n = s.length();
for(int i=0;i<n;i++){
res.put(s.charAt(i), res.getOrDefault(s.charAt(i), 0)+1);
}
for(int i=0;i<n;i++)
if(res.get(s.charAt(i))==1)
return i;
return -1;
}
只遍历一遍
public int firstUniqChar(String s) {
if(s==null || s.length()==0) {
return -1;
}
char[] chars = s.toCharArray();
Map<Character,Integer> charsPositions = new HashMap<>();
List<Integer> uniqsPositions = new ArrayList<>();
for(int i=0; i<chars.length; i++) {
char c = chars[i];
if(charsPositions.containsKey(c)) {
Integer charFirstPosition = charsPositions.get(c);
uniqsPositions.remove(charFirstPosition);
} else {
charsPositions.put(c,i);
uniqsPositions.add(i);
}
}
return uniqsPositions.isEmpty()?-1:uniqsPositions.get(0);
}