【剑指Offer-50】第一个只出现一次的字符
问题
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
示例
s = "abaccdeff"
返回 "b"
解答1:一次遍历
class Solution {
public:
char firstUniqChar(string s) {
int left = 0, right = 0, n = s.size();
int memo[128]{};
while (right < n) {
memo[s[right]]++;
while (left < n && memo[s[left]] > 1)
left++;
right++;
}
return left == n? ' ' : s[left];
}
};
重点思路
使用快慢指针,当快指针加入的数字导致慢指针指向的数字出现次数大于1时,慢指针开始移动,直到慢指针指向的数字出现次数为1。只需要一次遍历。
解答2:两次遍历
class Solution {
public:
char firstUniqChar(string s) {
int memo[26] = {0};
for (auto i : s) memo[i - 'a']++;
for (auto i : s) if (memo[i - 'a'] == 1) return i;
return ' ';
}
};