跳至主要內容

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


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

🟢   🔖  队列 哈希表 字符串 计数  🔗 力扣open in new window LeetCodeopen in new window

题目

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 只包含小写字母

解题思路

  1. 遍历字符串,构建哈希表(Map)记录每个字符在字符串中出现的次数。
  2. 再次遍历字符串,检查每个字符在哈希表中的出现次数。如果某个字符的出现次数为 1,说明它是第一个不重复的字符,返回它的索引。
  3. 如果没有找到不重复的字符,返回 -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+🟠🀄️open in new window 🔗open in new window
2351第一个出现两次的字母位运算 哈希表 字符串 1+🟢🀄️open in new window 🔗open in new window