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

给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1

示例 1:

1
2
输入: s = "leetcode"
输出: 0

示例 2:

1
2
输入: s = "loveleetcode"
输出: 2

示例 3:

1
2
输入: s = "aabb"
输出: -1

提示:

  • 1 <= s.length <= 105
  • s 只包含小写字母

题解:

哈希表法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static int firstUniqChar(String s) {
//将字符作为键,将字符出现次数作为值
Map<Character, Integer> map = new HashMap<>();
//第一次遍历将字符串存入
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
map.put(c, map.getOrDefault(c, 0) + 1);

}
//第二次遍历,找到第一个值为1的字符,返回其索引即可
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (map.get(c) == 1) {
return i;
}
}
return -1;

}
  • 时间复杂度:O(N),两次遍历

  • 空间复杂度:O(∣Σ∣),其中 Σ 是字符集,在本题中 s 只包含小写字母,因此∣Σ∣≤26。我们需要 O(∣Σ∣) 的空间存储哈希映射。