当前位置:网站首页>【LeetCode】387. 字符串中的第一个唯一字符

【LeetCode】387. 字符串中的第一个唯一字符

2022-06-24 07:07:00 Uaena_An

越做题越觉得自己是菜鸡

在这里插入图片描述

🧸读题

找到第一个,出现一次的字符,的下标。

🧸代码 O(N)

思路:用映射的方式查找,开一个数组记录每个字幕出现的次数,再找出数组中第一个是1的映射的字符!

class Solution {
    
public:
    int firstUniqChar(string s) {
    
        int countArr[26] = {
     0 };
        //统计次数
        for (int i = 0; i < s.size(); ++i)
        {
    
            countArr[s[i] - 'a']++;
        }
        for (int j = 0; j < s.size();++j)
        {
    
            if (countArr[s[j] - 'a'] == 1)
            {
    
                return j;
            }
        }
        return -1;
    }
};

🧸解读代码

通过映射的方式解决问题
int countArr[26] = { 0 };

题目说只有小写字母,所以映射的数组直接开26个即可!
并且初始化为0
s中的每个字符映射到,countArr所在的下标,countArr下标存的数字就是 这个字符出现的次数!

for (int i = 0; i < s.size(); ++i)
{
  countArr[s[i] - 'a']++;
}

icountArr数组的下标,范围是s.size()
例如查找l ,假设s[i]存储的是l ,遍历字符数组
'l' - 'a'等于11,也就是l映射到countArr的下标
所以在countArr[11] 的位置上 ++ ,如果l出现两次则在 countArr[11]的位置再++

for (int j = 0; j < s.size();++j)
{
  if (countArr[s[j] - 'a'] == 1)
  {
    return j;
  }
}

这个循环是遍历s字符串
js字符串的下标,范围是s.size()
例如查找l,假设l的位置是s[j]
因为'l' - 'a'等于11,也就是l映射到countArr[]的下标,这个下标存的是l出现的次数!
所以如果countArr[s[j] - 'a'] == 1
那么s[j]中的j就是,只出现一次的l字符,的下标!

🧸我快写蒙圈了,希望你看懂了!!!

🧸其他大佬的解法

这个解法是O(N2)
遍历数组,同时在两头向中间找,如果都找到了并且下标相同,则这个字符在整个s中只出现一次,此时直接返回下标即可

class Solution {
    
public:
    int firstUniqChar(string s) {
    
        for(int i = 0;i<s.size();++i)
		{
    
			if(s.find(s[i]) == s.rfind(s[i]))
			{
    
				return i;
			}
		}
        return -1;
    }
};

加油,祝你拿到心仪的offer!

原网站

版权声明
本文为[Uaena_An]所创,转载请带上原文链接,感谢
https://blog.csdn.net/iluo12/article/details/125432960