初级算法——字符串中的第一个唯一字符

  • Post author:
  • Post category:其他


题目

给定一个字符串

s

,找到

它的第一个不重复的字符,并返回它的索引

。如果不存在,则返回

-1

解法一:用哈希表存储频数

对于这种找重复的问题,我们可以很自然地想到Map,key存字母,value存频数。这里我们学习一下Map中getOrDefault()这个方法的使用,这个方法只需要使用一次就可以减少一次if-else的使用。不用再判断是否存在key值,如果存在得到key对应的value然后加一,如果不存在就把对应的key和0put进去。而是直接使用该方法,如果存在就置value为后面的值,如果不存在就值默认值。

同时我们还要注意一下第二次循环找数,如果直接使用map的for-each遍历,会导致找不到对应的下标(我第一次就是因为使用了for-each循环而走投无路,最后又改成存索引wuuuuuuuu。。。)

class Solution {
    public int firstUniqChar(String s) {
        Map<Character, Integer> hm = new HashMap<Character, Integer>();
        for (int i = 0; i < s.length(); ++i) {
            char ch = s.charAt(i);
            hm.put(ch, hm.getOrDefault(ch, 0) + 1);
        }
        for (int i = 0; i < s.length(); ++i) {
            if (hm.get(s.charAt(i)) == 1) {
                return i;
            }
        }
        return -1;
    }
}

解法二:用哈希表存数索引

和第一种大同小异

class Solution {
    public int firstUniqChar(String s) {
        HashMap<Character,Integer> m = new HashMap<>();
        for(int i = 0;i < s.length();i++){
            if(m.containsKey(s.charAt(i))){
                m.put(s.charAt(i),-1);
            }
            else{
                m.put(s.charAt(i),i);
            }
        }
        for(int i = 0;i<s.length();i++){
            if(m.get(s.charAt(i)) != -1){
                return i;
            }
        }
        return -1;
    }
}

解法三:使用String类自带库函数

只要正数和倒数的下标一致,证明就只出现一次。

class Solution {
    public int firstUniqChar(String s) {
        for(int i = 0;i < s.length();i++){
            char a = s.charAt(i);
            if(s.indexOf(a) == s.lastIndexOf(a)){
                return i;
            }
        }
        return -1;
    }
}



版权声明:本文为littlest_white原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。