image.png

解题思路

哈希表

这道题最优的解法就是线性复杂度了,为了保证每个元素是唯一的,至少得把每个字符都遍历一遍。
算法的思路就是遍历一遍字符串,然后把字符串中每个字符出现的次数保存在一个散列表中。这个过程的时间复杂度为 O(N),其中 N 为字符串的长度。
接下来需要再遍历一次字符串,这一次利用散列表来检查遍历的每个字符是不是唯一的。如果当前字符唯一,直接返回当前下标就可以了。第二次遍历的时间复杂度也是 O(N)。

  1. public int firstUniqChar(String s) {
  2. HashMap<Character,Integer> res = new HashMap<>();
  3. int n = s.length();
  4. for(int i=0;i<n;i++){
  5. res.put(s.charAt(i), res.getOrDefault(s.charAt(i), 0)+1);
  6. }
  7. for(int i=0;i<n;i++)
  8. if(res.get(s.charAt(i))==1)
  9. return i;
  10. return -1;
  11. }

只遍历一遍

  1. public int firstUniqChar(String s) {
  2. if(s==null || s.length()==0) {
  3. return -1;
  4. }
  5. char[] chars = s.toCharArray();
  6. Map<Character,Integer> charsPositions = new HashMap<>();
  7. List<Integer> uniqsPositions = new ArrayList<>();
  8. for(int i=0; i<chars.length; i++) {
  9. char c = chars[i];
  10. if(charsPositions.containsKey(c)) {
  11. Integer charFirstPosition = charsPositions.get(c);
  12. uniqsPositions.remove(charFirstPosition);
  13. } else {
  14. charsPositions.put(c,i);
  15. uniqsPositions.add(i);
  16. }
  17. }
  18. return uniqsPositions.isEmpty()?-1:uniqsPositions.get(0);
  19. }