💒越做题越觉得自己是菜鸡
🧸读题
找到第一个,出现一次的字符,的下标。
🧸代码 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;
}
};