Java如何查找字符串中第一个重复字符?尝试后获全部重复字符
如何找到字符串中的第一个重复字符
嘿,我完全懂你的烦恼——要定位到第一个重复出现的字符,和找出所有重复字符的思路确实不一样,核心在于要抓住「首次出现重复的那个瞬间」,而不是等全部遍历完再统计。咱们先拆解问题,再一步步给出靠谱的解法。
为什么你之前会得到所有重复字符?
大概率是你先完整遍历了字符串,统计了所有字符的出现次数,再把次数大于1的字符都捞出来。这种方法能找到所有重复项,但没法直接定位到第一个出现重复的那个字符——毕竟它不管顺序,只看频次。
最优解法:边遍历边记录,遇到重复立刻返回
我们可以用一个集合来记录已经见过的字符,每遍历一个字符就检查它是否在集合里:如果在,那它就是第一个重复的;如果不在,就把它加入集合继续走。这样一次遍历就能搞定,效率拉满。
以Python为例,代码实现如下:
def find_first_duplicate(s): seen_chars = set() for char in s: if char in seen_chars: # 找到第一个重复字符,直接返回 return char # 没见过的话,加入集合 seen_chars.add(char) # 遍历完没找到重复,返回None return None
代码解释:
- 初始化空集合
seen_chars,用来存已经遍历过的字符 - 逐个遍历字符串中的每个字符:
- 如果当前字符已经在集合里,说明这是它第二次出现,也就是我们要找的第一个重复字符,直接返回
- 如果不在集合里,就把它加入集合,继续遍历下一个
- 如果整个字符串遍历完都没有重复字符,返回
None
备选方案:先统计频次再遍历(适合需要复用频次数据的场景)
如果你之后还需要用到字符的频次统计,可以先统计所有字符的出现次数,再重新遍历字符串,找到第一个频次大于1的字符。这种方法需要两次遍历,但逻辑也很清晰:
from collections import Counter def find_first_duplicate_alternative(s): char_counts = Counter(s) for char in s: if char_counts[char] > 1: return char return None
注意事项
- 如果需要忽略大小写(比如把'A'和'a'视为同一个字符),可以在检查前把字符统一转成小写或大写:
char.lower() - 特殊字符、空格等也会被正常处理,如果需要排除这类字符,可以在遍历前先过滤字符串
内容的提问来源于stack exchange,提问作者John Mason
相关产品推荐
相关产品推荐

