leetcode387字符串中的第一个唯一字符|刷题打卡04

338 阅读2分钟

前言


昨天学习了字符串和KMP算法,很惭愧由于自身时间问题,对于KMP算法理解地还不是非常透彻,只是大概地了解了一下算法的作用,所以目前还没法以此作文。今天在力扣上找了几道基础的字符串题练手,希望能先慢慢地巩固字符串的知识,再深入KMP算法。

F06C835671F36AB32BB1AF9D4D269456.jpg

题目描述:


给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

示例:

s = "leetcode"
返回 0

s = "loveleetcode"
返回 2

提示:你可以假定该字符串只包含小写字母。

思路分析:


  • 这个题目对于学习了JavaScript语言的来说,非常简单,只需要了解indexOf()lastindexOf()的用法就可以了,他们的作用都是返回一串字符串中标志字符第一次出现的位置,但区别是indexOf()是以从左往右的顺序进行查询,而lastindexOf()的查询顺序是从右往左,所以当字符串中有两个重复的标志字符时,indexOf()lastindexOf()返回的值并不相同,借此,便可以通过if判定了。

  • 可能最近准备蓝桥杯的原因,我太喜欢暴力算法了。。。运用for循环双层嵌套也可以解出这道题目。大体思路是,设置两层for循环,遍历同时设置标志变量flag用于判断是否有重复的情况,如果有,命令flag为1,反则,flag为0。当函数下标为i的字符没有对应重复的字符时,它即为第一个不重复的字符串,返回即可。

 for(int i=0;i<s.length();i++){
            flag=0;
            for(int j=0;j<s.length();j++){
                if(s[i]==s[j]&&i!=j){
                   flag=1;
                   break; 
                }    
            }
            if(!flag)
                return i;
        }

AC 代码:


JS

var firstUniqChar = function(s) {
    for(let i in s){
        if(s.indexOf(s[i]) == s.lastIndexOf(s[i])){
            return i
        }
    }
    return -1;
};

C++暴力解法

class Solution {
public:
    int firstUniqChar(string s) {
        int flag;
        for(int i=0;i<s.length();i++){
            flag=0;
            for(int j=0;j<s.length();j++){
                if(s[i]==s[j]&&i!=j){
                   flag=1;
                   break; 
                }    
            }
            if(!flag)
                return i;
        }
        return -1;
    }
};

总结:

  • 这道题我首先想到的方法是运用JS语言中的indexOf()函数,但是翻看力扣其他更加优秀的解法,发现C++中也有类似的函数,即find()rfind()函数,两者的用法相似,对应C++代码就不贴了

  • 在暴力解法中,我首先是将j的值设定为1,设想是,当i=0时,循环从j=1,即第二个字符开始遍历,思路好像没错,而且又少经过了一次循环,在我沾沾自喜时,没想到题目的结果却是无法通过...给出了字符串“cc”的栗子。后来我终于明白,当输入“cc”时,第一遍循环其实虽然是可以得到flag1的结果,但是注意!! 此时循环还没有停止,接着进行了第二次循环,flag又变成了1!!,于是正好返回了1,结果就错误了...虽然是很小的错误,但是还是需要注意的...👀

  • 翻看力扣官方解析,这道题还可以使用哈希算法解决,可惜我对哈希并不熟悉,等我肝到哈希,再来更新这篇文章吧...😃

这是我的第四篇文章,感谢阅读到这里的你,如果我的文章能对你有启发的话,请不要吝啬你的手中的赞~ 4S8F{~`RT)~FNLU9(6)$2MM.png

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情