返回工具主页

滑动窗口找同源词

在字符串 s 中找出所有长度等于 p 且为 p 同源词(相同字母重排,不区分大小写)的子串起始索引。

时间复杂度:O(m) | 空间复杂度:O(1)

字符串 s 与滑动窗口

绿色高亮为当前窗口,紫色为已找到的匹配位置
点击“开始演示”观察滑动窗口过程。

字符频次统计

绿色表示 scount 与 pcount 相等,红色表示不等
已找到起点:

操作控制

0
比较次数
0
匹配数

例题(1)解析

s="cbaebAcdbabc" 不变,p="ab" 时,所有同源词起点为:

可在上方输入框中修改 p 为 ab 并运行,验证结果。

完整参考代码

def pos(c):
if 'A' <= c <= 'Z':
return ord(c) - 65
else:
return ord(c) - 97
s = input("请输入s:")
p = input("请输入p:")
scount = [0] * 26
pcount = [0] * 26
m = len(s)
n = len(p)
ans = []
for i in range(n):
scount[pos(s[i])] += 1
pcount[pos(p[i])] += 1
if scount == pcount:
ans.append(0)
for i in range(m - n):
scount[pos(s[i])] -= 1
scount[pos(s[i + n])] += 1
if scount == pcount:
ans.append(i + 1)
print('同源词起点为:', ans, end=" ")

划线处已填:① 'A' <= c <= 'Z';② pos(s[i + n]);③ i + 1