算法-字符串唯一字符

102 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第26天,点击查看活动详情

题目来源:leetcode-cn.com/leetbook/re…

题目

给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。(s 只包含小写字母)

输入: s = "loveleetcode"
输出: 2
​
输入: s = "aabb"
输出: -1

思路分析

第一种解法:通过枚举解决,使用一个数组来记录每个元素出现次数,先统计每个字符出现的次数,第二遍再次从前往后遍历字符串s中的每个字符,如果某个字符出现一次直接返回,原来比较简单,看下代码如 l 出现2次,那么可以在数组 ary[1] = 2,然后遍历数组中值为1 就是的位置就是结果。

如果不使用数组,也可以使用一个键值对象,比如 hashmap。然后统计每个字母出现的次数,最后再去查找其在数组中的所在位置。

另外一种比较简单的解法,就是利用语言已经提供的方法,比如 find 方法去查询,得到2条数据都忽略,只有一个的即是输出结果。

代码实现

​
function func_exerise8 (s){
    let res = {}
    let data = s.split('')
    for(let i=0;i<data.length;i++){
        if(res[data[i]]){
            res[data[i]]++;
        }else{
            res[data[i]] = 1;
        }
    }
   for(let i=0;i<data.length;i++){
       if(res[data[i]]==1){
           return i;
       }
   }
}

双指针解题 双指针也称为快慢,是指两个指针同时从同一侧开始遍历数组,将这两个指针分别定义为快指针(fast)慢指针(slow),两个指针以不同的策略移动,直到两个指针的值相等(或其他特殊条件)为止,如fast每次增长两个,slow每次增长一个。 该题的题型和之前的数组中找唯一值是相同。所以其实也是可以使用双指针的方式遍历找到唯一的值。这样的效率应该会更高的,一前一后的指针进行遍历。

 public int firstUniqChar(String s) {
        int i=0;
        int j=1;
        int len=s.length();
        for(;j<len;j++){
            if(i!=j){
                if(s.charAt(i)==s.charAt(j)){
                    i++;
                    j=-1;
                }
            }
            if(i==len)
            return -1;
        }
        return i;
    }