本文主要是介绍2021-8-20 387. 字符串中的第一个唯一字符(哈希表),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
注:
题目:
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例:
s = “leetcode”
返回 0
s = “loveleetcode”
返回 2
提示:你可以假定该字符串只包含小写字母。
题解:
对于哈希映射中的每一个键值对,键表示一个字符,值表示它的首次出现的索引(如果该字符只出现一次)或者 −1(如果该字符出现多次)。当我们第一次遍历字符串时,设当前遍历到的字符为 c,如果 c 不在哈希映射中,我们就将 c 与它的索引作为一个键值对加入哈希映射中,否则我们将 c 在哈希映射中对应的值修改为 −1。
在第一次遍历结束后,我们只需要再遍历一次哈希映射中的所有值,找出其中不为 −1 的最小值,即为第一个不重复字符的索引。如果哈希映射中的所有值均为 −1,我们就返回 −1。
复杂度分析
时间复杂度:O(n),其中 n 是字符串 s 的长度。第一次遍历字符串的时间复杂度为 O(n),第二次遍历哈希映射的时间复杂度为 O(∣Σ∣),由于 s 包含的字符种类数一定小于 s 的长度,因此 O(∣Σ∣) 在渐进意义下小于 O(n),可以忽略。
空间复杂度:O(∣Σ∣),其中Σ 是字符集,在本题中 s 只包含小写字母,因此∣Σ∣≤26。我们需要 O(∣Σ∣) 的空间存储哈希映射。
class Solution {
public:int firstUniqChar(string s) {map<char,int> char_index;for(int i=0;i<s.size();i++){if(char_index.count(s[i])==0){char_index[s[i]]=i;}else{char_index[s[i]]=-1;}}int result=INT_MAX;for(auto p:char_index){if(p.second==-1){continue;}else{result=min(result,p.second);}}return result==INT_MAX?-1:result;}
};
这篇关于2021-8-20 387. 字符串中的第一个唯一字符(哈希表)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!