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++代码
|
|