如何高效判断给定字符串仅存在单个重复字符?
判断字符串是否仅含单个重复字符的优化解法
首先明确需求:我们要实现一个方法,接收字符串后返回布尔值,判断该字符串是否仅存在单个重复字符(该字符可重复任意多次),示例参考:
'abca'→ True(仅字符a重复)'abab'→ False(a和b都重复)'aaaa'→ True(仅字符a重复)
先点评你的现有代码
你的思路方向是对的:用collections.Counter统计字符出现次数,过滤掉单次出现的字符后,判断剩余结果长度是否为1。不过这里有个小bug:在Python3中,filter()返回的是迭代器,不能直接用len(),得改成len(list(result))才能正常运行。
另外,我们可以进一步简化逻辑、提升效率,下面给出两种更优的实现方式:
方法1:简化Counter实现(简洁优先)
from collections import Counter def has_only_one_duplicate(s): char_counts = Counter(s) # 统计出现次数大于1的字符数量 duplicate_char_num = sum(1 for cnt in char_counts.values() if cnt > 1) return duplicate_char_num == 1
这个写法用生成器表达式直接统计重复字符的数量,相比原代码的filter+转列表,更简洁且内存效率更高(生成器不需要一次性加载所有结果到内存)。
方法2:提前终止的手动统计(性能优先)
如果处理的是超长字符串,我们可以在遍历过程中提前终止,不用等到统计完所有字符:
def has_only_one_duplicate(s): seen_chars = {} duplicate_chars = set() for char in s: if char in seen_chars: duplicate_chars.add(char) # 一旦发现第二个不同的重复字符,直接返回False if len(duplicate_chars) >= 2: return False else: seen_chars[char] = 1 # 遍历结束后,检查是否只有一个重复字符 return len(duplicate_chars) == 1
比如输入'ababxxxx',当遍历到第二个b时,我们就知道已经有两个重复字符了,直接返回False,不用处理后面的所有字符,性能会更好。
总结
- 若追求代码简洁易读,方法1是不错的选择;
- 若处理大字符串、追求极致性能,方法2的提前终止逻辑会更高效。
内容的提问来源于stack exchange,提问作者user5494969
相关产品推荐
相关产品推荐

