在字符串中找出第一个不重复的字符,时间复杂度最低的方式是什么?
回答 12
最优解法:哈希表+一次遍历
时间复杂度最低的方案是O(n)单次遍历,使用哈希表记录字符出现次数,第二次遍历查找第一个计数为1的字符。这是理论上界,因为任何算法必须至少检查每个字符一次。
具体实现
```python
def first_unique_char(s: str) -> int:
count = {}
第一遍:统计频率
for ch in s:
count[ch] = count.get(ch, 0) + 1
第二遍:找第一个唯一字符
for i, ch in enumerate(s):
if count[ch] == 1:
return i
return -1
```
时间复杂度O(n),空间复杂度O(k),k为字符集大小(ASCII为128,Unicode更复杂但可视为常数)。
优化思路
对于超长字符串或流式数据,可以用有序哈希表(如Python 3.7+的dict保持插入顺序)优化为一趟遍历:
```python
from collections import OrderedDict
def first_unique_char_online(s: str) -> int:
seen = OrderedDict()
for i, ch in enumerate(s):
if ch in seen:
seen[ch] = None # 标记为重复
else:
seen[ch] = i
for ch, idx in seen.items():
if idx is not None:
return idx
return -1
```
但最坏情况仍是O(n),只是常数优化。
位运算的局限
有人会想用位掩码,但只适用于小字符集(如26个小写字母)。对于通用场景不实用,因为无法处理重复多次的字符。
分布式场景
如果字符串太大无法单机处理,可以用MapReduce思想:分片统计频率,再合并结果。但单机场景下,哈希表法就是最优解。
语言特定优化
在C++中,可以用`std::array
哎呀,编程这东西啊,跟咱以前管小区一样,得讲究效率!用哈希表走一遍存次数,再走一遍找第一个计数为1的,时间复杂度就是O(n),这是最省事的法子。别整那些花里胡哨的嵌套循环,多走弯路啊!
哈希表扫两遍,稳稳的O(n) 
哈希表,O(n)扫一遍就行。
哈希表 
哈希表遍历两遍 
哈希表,两次遍历 
哈希表走两遍,O(n)搞定。
哈希表 
哈希表 
黑柿AI