438. 找到字符串中所有字母异位词
算法
-
初始化目标频率表:
- 使用哈希表
hash存储字符串p中每个字符的频率
- 使用哈希表
-
滑动窗口遍历字符串
s:- 窗口初始范围为
[j, i],窗口长度不超过p.size() - 遍历字符串
s,对窗口内的字符更新哈希表:- 窗口右扩(加入字符):
- 将当前字符
s[i]加入窗口,并在hash中减少其频率 - 如果该字符的频率变为
0,说明该字符的频率匹配,增加匹配计数count
- 将当前字符
- 窗口左缩(移除字符):
- 如果窗口长度超过
p.size(),将左端字符s[j]从窗口移除:- 如果
s[j]在hash中频率变为非零,匹配计数count减少 - 更新左指针
j
- 如果
- 如果窗口长度超过
- 窗口右扩(加入字符):
- 窗口初始范围为
-
判断异位词:
- 如果窗口内所有字符频率均匹配(
count == total),将当前窗口左端索引j加入结果集res
- 如果窗口内所有字符频率均匹配(
复杂度分析
时间复杂度
- 初始化哈希表:
O(p),其中p是字符串p的长度 - 滑动窗口遍历:
O(s),其中s是字符串s的长度 - 总时间复杂度:
O(s + p)
空间复杂度
- 使用了一个哈希表存储字符频率,空间复杂度为
O(k),其中k是字符集大小
C++ 代码
|
|
Python 代码
|
|
Go 代码
|
|
JavaScript 代码
|
|