《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之每日一题》:281.字符串中的第一个唯一字符