💒越做题越觉得自己是菜鸡

🧸读题
找到第一个,出现一次的字符,的下标。
🧸代码 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']++;
}
i是countArr数组的下标,范围是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字符串
j是s字符串的下标,范围是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;
}
};

这篇博客介绍了如何用O(N)的时间复杂度解决找到字符串里首次出现且仅出现一次的字符的下标问题。通过创建一个计数数组,遍历字符串统计每个字符出现的次数,然后再次遍历字符串找到第一个计数为1的字符的下标。此外,还提供了一个O(N^2)的解决方案作为对比。博客作者希望通过这种方式帮助读者更好地理解和掌握算法技巧。
286

被折叠的 条评论
为什么被折叠?



