方法一:哈希表
思路与算法
用 set 记录每个字母出现的次数。
代码
class Solution {
public char repeatedCharacter(String s) {
Set<Character> set = new HashSet<>();
char[] chs = s.toCharArray();
for (char u : chs) {
if (!set.add(u)) {
return u;
}
}
return 'a';
}
}
复杂度分析
时间复杂度:O(n),遍历一次。
空间复杂度:O(26),字母个数。
方法二:数组
思路与算法
用 int[] 记录每个字母出现的次数。
代码
class Solution {
public char repeatedCharacter(String s) {
int[] arr = new int[26];
char[] chs = s.toCharArray();
for (char u : chs) {
if (arr[u - 'a'] == 1) {
return u;
}
arr[u - 'a']++;
}
return 'a';
}
}
复杂度分析
时间复杂度:O(n),遍历一次。
空间复杂度:O(26),字母个数。
方法三:状态压缩
思路与算法
用 int 的 32 个 bit 记录每个字母是否出现过。
代码
class Solution {
public char repeatedCharacter(String s) {
int seen = 0;
char[] chs = s.toCharArray();
for (char u : chs) {
int x = u - 'a';
if ((seen & (1 << x)) != 0) {
return u;
}
seen |= (1 << x);
}
return 'a';
}
}
复杂度分析
时间复杂度:O(n),遍历一次。
空间复杂度:O(1),一个 int 表示。