387. 字符串中的第一个唯一字符
387. 字符串中的第一个唯一字符
🟢 🔖 队列
哈希表
字符串
计数
🔗 力扣
LeetCode
题目
Given a string s
, find the first non-repeating character in it and return its index. If it does not exist, return -1
.
Example 1:
Input: s = "leetcode"
Output: 0
Explanation:
The character 'l'
at index 0 is the first character that does not occur at any other index.
Example 2:
Input: s = "loveleetcode"
Output: 2
Example 3:
Input: s = "aabb"
Output: -1
Constraints:
1 <= s.length <= 10^5
s
consists of only lowercase English letters.
题目大意
给定一个字符串 s
,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1
。
示例 1:
输入: s = "leetcode"
输出: 0
示例 2:
输入: s = "loveleetcode"
输出: 2
示例 3:
输入: s = "aabb"
输出: -1
提示:
1 <= s.length <= 10^5
s
只包含小写字母
解题思路
- 遍历字符串,构建哈希表(Map)记录每个字符在字符串中出现的次数。
- 再次遍历字符串,检查每个字符在哈希表中的出现次数。如果某个字符的出现次数为 1,说明它是第一个不重复的字符,返回它的索引。
- 如果没有找到不重复的字符,返回 -1。
复杂度分析
- 时间复杂度:
O(n)
,其中n
是字符串s
的长度。第一次遍历用来构建哈希表,第二次遍历用来查找第一个不重复的字符,都是线性时间。 - 空间复杂度:
O(1)
,由于只有 26 个字母,我们使用的哈希表空间是常数级别的。
代码
/**
* @param {string} s
* @return {number}
*/
var firstUniqChar = function (s) {
const count = new Map();
// 统计每个字符的出现次数
for (let char of s) {
count.set(char, (count.get(char) || 0) + 1);
}
// 查找第一个出现次数为 1 的字符
for (let i = 0; i < s.length; i++) {
if (count.get(s[i]) === 1) {
return i;
}
}
// 如果没有找到,返回 -1
return -1;
};
相关题目
题号 | 标题 | 题解 | 标签 | 难度 | 力扣 |
---|---|---|---|---|---|
451 | 根据字符出现频率排序 | [✓] | 哈希表 字符串 桶排序 3+ | 🟠 | 🀄️ 🔗 |
2351 | 第一个出现两次的字母 | 位运算 哈希表 字符串 1+ | 🟢 | 🀄️ 🔗 |