AcWing 831. KMP字符串 python
原题链接
简单
#!usr/bin/env python
# -*- coding:utf-8 -*-
# author: ShidongDu time:2020/5/29
'''
给定一个模式串S,以及一个模板串P,所有字符串中只包含大小写英文字母以及阿拉伯数字。
模板串P在模式串S中多次作为子串出现。
求出模板串P在模式串S中所有出现的位置的起始下标。
输入格式
第一行输入整数N,表示字符串P的长度。
第二行输入字符串P。
第三行输入整数M,表示字符串S的长度。
第四行输入字符串S。
输出格式
共一行,输出所有出现位置的起始下标(下标从0开始计数),整数之间用空格隔开。
数据范围
1≤N≤105
1≤M≤106
输入样例:
3
aba
5
ababa
输出样例:
0 2
'''
class Solution:
def __init__(self):
# 下标从0开始
pass
def KMP(self, s: str, p: str):
next = self.get_next(p)
m = len(s)
n = len(p)
j = -1
for i in range(m):
while(j!=-1 and s[i] != p[j+1]):
j = next[j]
if s[i]==p[j+1]:
j+=1
if j == n-1:
print(i-j, end=' ')
j = next[j]
def get_next(self, p: str):
n = len(p)
next = [0 for _ in range(n)]
next[0] = -1
j = -1
for i in range(1, n):
while(j!=-1 and p[i]!=p[j+1]):
j = next[j]
if p[i] == p[j+1]: j += 1
next[i] = j
return next
class Solution:
def __init__(self):
# 下标从1开始,推荐
pass
def KMP(self, s: str, p: str):
n = len(p)
s = ' '+s
p = ' '+p
next = self.get_next(p)
j = 0
for i in range(1, len(s)):
while(j and s[i]!=p[j+1]):
j = next[j]
if (s[i]==p[j+1]):
j += 1
if (j==n):
print(i-n, end=' ')
j = next[j]
def get_next(self, p: str):
next = [0 for _ in range(len(p))]
j = 0
for i in range(2, len(p)):
while (j and p[i]!=p[j+1]):
j = next[j]
if (p[i]==p[j+1]):
j += 1
next[i] = j
return next
if __name__ == '__main__':
solution = Solution()
N = input()
P = input()
M = input()
S = input()
res = solution.KMP(S, P)