LeetCode - 387. 字符串中的第一个唯一字符
题目
387. 字符串中的第一个唯一字符 - 力扣(LeetCode)
思路
用哈希表统计每个字符出现的次数
- 创建一个 unordered_map<char, int>,遍历字符串,把每个字符出现的次数存进去。
再遍历字符串,找到第一个只出现一次的字符
- 再次遍历字符串,查哈希表,如果某个字符的次数为1,返回它的下标。
如果没有,返回-1
读者可能出现的错误写法
class Solution {
public:int firstUniqChar(string s) {vector<char,int> result;for(char e : s){result[e]++;}for(int i = 0;i<result.size();i++){if(result[i] == 1){return i;}}return -1;}
};
1. vector<char, int> result; 语法错误
- 解释:
vector 是顺序容器,只能有一个类型参数,比如 vector<int> 或 vector<char>,不能像 map 那样有两个类型参数。
- 正确用法:
如果你想统计每个字符出现的次数,应该用 unordered_map<char, int> 或者用数组 int result[26](只针对小写字母)。
2. result[e]++ 逻辑错误
- 解释:
vector 不能用字符 e 作为下标,只有数组或 map 才能这样用。
并且 vector 的下标必须是整数,且不能自动扩容到字符的ASCII值。
- 正确用法:
- 如果用数组:result[e - 'a']++,前提是 result 长度为26。
- 如果用 unordered_map:result[e]++。
3. 第二个循环遍历方式错误
- 解释:
你写的是 for(int i = 0; i < result.size(); i++),但 result.size() 不是字符串长度,而是容器长度。
你应该遍历字符串 s,判断每个字符出现的次数是否为1。
- 正确用法:
for(int i = 0; i < s.size(); i++) { if (result[s[i] - 'a'] == 1) return i; }
正确写法
class Solution {
public:int firstUniqChar(string s) {unordered_map<char,int> result;for(char e : s){result[e]++;}for(int i = 0;i<s.size();i++){if(result[s[i]] == 1){return i;}}return -1;}
};