【剑指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 ' ';
    }
};
posted @ 2021-03-05 17:45  tmpUser  阅读(38)  评论(0编辑  收藏  举报