387. 字符串中的第一个唯一字符
题目
给定一个字符串 s
,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1
。
提示:
1 <= s.length <= 105
s
只包含小写字母
示例
示例 1:
输入: s = "leetcode"
输出: 0
示例 2:
输入: s = "loveleetcode"
输出: 2
示例 3:
输入: s = "aabb"
输出: -1
题解1 - 使用哈希表存储索引
自己想的,还是不如2的速度快
class Solution {
public:
int firstUniqChar(string s) {
unordered_map<char,int> hashmap;
for(int i = 0; i < s.size();i++){
if(hashmap.find(s[i]) != hashmap.end()){
//在map中找到了s[i]
hashmap[s[i]] = -1;
}else{
hashmap[s[i]] = i;
}
}
int min = INT_MAX; // 使用INT_MAX来表示一个足够大的数
for (const auto& pair : hashmap) {
if (pair.second != -1 && pair.second < min) {
min = pair.second;
}
}
return min == INT_MAX ? -1 : min;
}
};
题解2 - 使用哈希表存储频数
来自力扣官方。
使用哈希表时候还是要考虑下哈希表的值存储啥,例如这道题,存储频数就要高效。
并且,本题中,字符char
可以存储成int
形式,也就是ASCII
码。
class Solution {
public:
int firstUniqChar(string s) {
unordered_map<int, int> frequency;
for (char ch: s) {
++frequency[ch];
}
for (int i = 0; i < s.size(); ++i) {
if (frequency[s[i]] == 1) {
return i;
}
}
return -1;
}
};
C++相关语法:i++
和++i
在 C++ 中,i++
和 ++i
都是用来增加变量 i
的值的操作,但它们在执行时的行为有所不同:
-
i++
(后置增量):- 这是最常见的增量操作,通常称为“后置增量”。
- 在表达式中使用
i++
时,它会返回变量i
的当前值,然后i
的值增加 1。 - 这意味着在表达式求值后,
i
的值才会增加。
-
++i
(前置增量):-
这种增量操作称为“前置增量”。
-
使用
++i
时,它会先将变量i
的值增加 1,然后返回新值。 -
这意味着在表达式求值之前,
i
的值就已经增加了。 -
int a = 1; int b = ++a; // b 将会是 2
-
在 for
循环中,特别是在循环的迭代部分,使用 i++
和 ++i
实际上是等价的。这是因为在 for
循环的迭代部分,我们只关心变量 i
的递增,而不需要使用递增后的值。因此,无论是 i++
还是 ++i
,都会导致 i
的值在每次循环迭代结束时增加 1。
以下两个循环的行为是完全相同的:
for (int i = 0; i < s.size(); ++i) {
// 循环体
}
for (int i = 0; i < s.size(); i++) {
// 循环体
}
标签:hashmap,min,++,示例,C++,int,哈希,387,LeetCode
From: https://blog.csdn.net/woshihlf/article/details/142468351