《LeetCode之每日一题》:130.字符串中的第一个唯一字符

Posted 是七喜呀!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:130.字符串中的第一个唯一字符相关的知识,希望对你有一定的参考价值。

字符串中的第一个唯一字符


题目链接: 字符串中的第一个唯一字符

有关题目

给定一个字符串,找到它的第一个不重复的字符,
并返回它的索引。如果不存在,则返回 -1
示例:

s = "leetcode"
返回 0

s = "loveleetcode"
返回 2
提示:你可以假定该字符串只包含小写字母。

题解

法一:使用哈希表存储频数

class Solution {
public:
    int firstUniqChar(string s) {
        unordered_map<char, int> mp;
        for (auto& ch : s){
            ++mp[ch];
        }
        for (int i = 0; i < s.size(); ++i){
            if (mp[s[i]] == 1){
                return i;
            }
        }
        return -1;
    }
};

法二:哈希表存储索引

哈希表按照索引从左往右依次存储键值对
class Solution {
public:
    int firstUniqChar(string s) {
        int n = s.size();
        unordered_map<char, int> mp;//s[i]为键,索引为值
        for (int i = 0; i < n; ++i){
            if (mp.count(s[i])){
                mp[s[i]] = -1;
            }
            else {
                mp[s[i]] = i;
            }
        }
        int firstPos = n;
        for (auto[_, pos] : mp){
            if (pos != -1 && pos < firstPos){
                firstPos = pos;
            }
        }
        return firstPos == n ? -1 : firstPos;
    }
};


法三:队列

队列具有「先进先出」的性质,
我们可以使用队列来找出第一个出现的不重复字符
同时我们对于队列,使用使用一下小技巧--延迟删除,
即对于某个非队列队首重复字母,我们优先将队列队首重复字母删除完毕,再删除该字符
class Solution {
public:
    int firstUniqChar(string s) {
        int n = s.size();
        unordered_map<char, int> mp;
        queue<pair<char, int>> q;
        
        for (int i = 0; i < n; ++i){
            if (!mp.count(s[i])){
                mp[s[i]] = i;
                q.emplace(s[i], i);
            }
            else {
                mp[s[i]] = -1;
                while (!q.empty() && mp[q.front().first] == -1){
                    //延迟删除,先删除队首出现的重复元素
                    q.pop();
                }
            }
        }
        return q.empty() ? -1 : q.front().second;
    }
};

以上是关于《LeetCode之每日一题》:130.字符串中的第一个唯一字符的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:171.符串中的单词数

《LeetCode之每日一题》:281.字符串中的第一个唯一字符

《LeetCode之每日一题》:231.最短补全词

《LeetCode之每日一题》:129.反转字符串

《LeetCode之每日一题》:73.删除字符串中的所有相邻重复项

《LeetCode之每日一题》:32.宝石与石头