在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
示例:
s = “abaccdeff”
返回 “b”
s = “”
返回 " "
思路一:哈希表 unordered_map
class Solution {
public:
char firstUniqChar(string s) {
char ret = ' ';
int len = s.size();
unordered_map<char,int> str;
if(0 == len) {
return ret;
}
for(char ch : s) {
str[ch]++;
}
for(int i = 0; i < len; i++) {
if(str[s[i]] == 1) {
ret = s[i];
break;
}
}
return ret;
}
};
思路二:队列
-
利用队列先进先出的性质,
-
用队列来维护一个存储曾经出现一次的字符,用长度为26的int数组存储每个字符出现的次数
-
再遍历队列,如果队头字符出现次数超过两次,则出队
对于用例: s=“abaccdeff”
初始队列: [a][b][c][d][e][f]
出现次数:
a: 2, 出队,当前队列:[b][c][d][e][f]
b: 1, 结束。
class Solution {
public:
char firstUniqChar(string s) {
if(s.size() == 0) return ' ';
char ret = ' ';
int count[26] = {0};
queue<char> que;
for(int i = 0; i < s.size(); i++) {
char ch = s[i];
int k = ch - 'a';
count[k]++;
if(count[k] == 1) {
que.push(ch);
}
}
while(!que.empty()) {
char ch = que.front();
int k = ch - 'a';
if(count[k] == 1) {
ret = ch;
break;
}
else {
que.pop();
}
}
return ret;
}
};