如何在Python中更高效地查找首个不重复字符?
优化首个不重复字符查找函数的方案
没问题,咱们来聊聊怎么优化你这个函数,先说说原代码的问题,再给出高效的实现~
原代码的效率瓶颈
你写的这段代码逻辑是对的,但确实在处理长字符串时会很慢。原因在于:
- 每次调用
s.count(c)都会完整遍历一遍整个字符串来统计当前字符的出现次数 - 外层又有一个遍历整个字符串的循环,所以整体时间复杂度是
O(n²)——比如当字符串长度是10000时,实际要执行10000*10000=1亿次操作,效率极低
优化后的实现(O(n)时间复杂度)
我们可以用**哈希表(字典)**先统计所有字符的出现次数,再遍历一次字符串找到第一个次数为1的字符,这样只需要两次线性遍历,时间复杂度降到O(n):
def first_unique_char(s): # 第一步:统计每个字符的出现次数,仅遍历一次字符串 char_count = {} for c in s: # 用get方法简化计数:如果字符不存在,默认计数0,加1后存入 char_count[c] = char_count.get(c, 0) + 1 # 第二步:再次遍历字符串,找到第一个出现次数为1的字符 for c in s: if char_count[c] == 1: return c # 没有找到不重复字符时返回None return None
如果想让代码更简洁,也可以用Python标准库的collections.Counter(底层逻辑和上面的手动统计完全一致):
from collections import Counter def first_unique_char(s): char_count = Counter(s) for c in s: if char_count[c] == 1: return c return None
为什么优化版本更优?
时间效率:
- 两次遍历都是线性的,总时间复杂度为
O(n),对于长字符串来说,性能提升是数量级的差异 - 比如处理长度为104的字符串,原代码需要108次操作,优化后只需要2*10^4次操作
- 两次遍历都是线性的,总时间复杂度为
空间效率:
- 虽然用了字典,但字符集的大小是固定的(比如小写英文字母最多26个,ASCII字符最多128个),所以字典的空间占用是常数级的,属于
O(1)空间复杂度,不会随着字符串长度增长而大幅增加
- 虽然用了字典,但字符集的大小是固定的(比如小写英文字母最多26个,ASCII字符最多128个),所以字典的空间占用是常数级的,属于
测试一下你的示例:
first_unique_char("leetcode")→ 返回"l"first_unique_char("loveleetcode")→ 返回"v"first_unique_char("aabb")→ 返回None
完全符合你的需求~
内容的提问来源于stack exchange,提问作者user32642875
相关产品推荐
相关产品推荐

