AcWing 831. KMP字符串-python3
原题链接
简单
作者:
Actor丶
,
2020-03-22 21:52:58
,
所有人可见
,
阅读 554
def kmp(s, p, m, n):
# 1. 生成next数组
j = 0
for i in range(2, n+1): # 因为ne[1]默认等于0,所以循环从2开始
# print(i, j)
while j and p[i]!=p[j+1]:
j = ne[j]
if p[i]==p[j+1]:
j+=1
ne[i] = j
# 2. 字符串匹配
j = 0
for i in range(1, m+1):
# print(i, j)
while j and s[i]!=p[j+1]:
j = ne[j]
if s[i]==p[j+1]:
j+=1
if j==n:
print(i-n, end=" ") # !!!出错:匹配子串的起始位置写成了j-n
j = ne[j]
if __name__=="__main__":
n = int(input().strip()) # p的长度
p = " "
p += input().strip()
m = int(input().strip()) # s的长度
s = " "
s += input().strip()
ne = [0]*(n+2)
kmp(s, p, m, n)