1、题目描述
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
示例 1:
输入:s = “abaccdeff”
输出:‘b’
2、VS2019上运行
使用方法一:使用哈希表存储频数
- 对字符串进行两次遍历
- 在第一次遍历时,使用哈希映射统计出字符串中每个字符出现的次数
- 第二次遍历时,只要遍历到了一个只出现一次的字符,那么就返回该字符,否则在遍历结束后返回空格。
#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;
class Solution {
public:
char firstUniqChar(string s) {
unordered_map<char, int> frequency; // 用于存储字符和对应的频率的无序映射
for (char ch : s) {//对于字符串s中的每个字符,将其依次赋值给ch
++frequency[ch]; // 统计每个字符出现的频率
}
for (int i = 0; i < s.size(); ++i) {
if (frequency[s[i]] == 1) { // 查找第一个频率为1的字符
return s[i];
}
}
return ' '; // 如果没有不重复的字符,返回空格
}
};
int main() {
string input = "abaccdeff";
Solution solution;
char result = solution.firstUniqChar(input);
cout << "The first unique character: " << result << "\n";
return 0;
}
The first unique character: b
3、补充
- unordered_map<int, int> frequency 用于存储字符出现的频率。其中,键(key)是字符的ASCII码值,值(value)是对应字符出现的次数。
- 在循环 for (char ch : s) 中,将字符串 s 中的每个字符赋值给变量 ch,然后通过 ++frequency[ch] 来增加对应字符的频率计数。这里的 frequency[ch] 表示获取字母 ch 对应的频率。
- 例如,对于字符串 “leetcode”,循环的第一次迭代中,ch 的值为 ‘l’,所以 ++frequency[ch] 将 frequency[‘l’] 的值增加 1。依次类推,循环结束后,frequency 的内容将如下所示
frequency = {
'a': 2,
'b': 1,
'c': 2,
'd': 1,
'e': 1,
'f': 2
}