系列文章目录
前言
一、NC149字符串匹配KMP算法
描述: 给你一个文本串T,一个非空模板串S,问S在T中出现了多少次
数据范围: 1<=len(S)<=500000,1<=len(T)<=1000000
要求: 空间复杂度O(len(S)),时间复杂度O(len(S)+len(T))
示例1:
输入:“ababab”,“abababab”
返回值:2
示例2:
输入:“abab”,“abacabab”
返回值:1
二、sound code
代码如下(示例):
class Solution:
def kmp(self , S: str, T: str) -> int:
if S == '': return 0
n = len(S)
m = len(T)
j = 0
pnext = self.getnext(S)
res = []
for i in range(m):
while j > 0 and S[j] != T[i]:
j = pnext[j] #对应位置不匹配就一直回溯,直到回溯到0
if S[j] == T[i]:
j += 1 #如果对应位置相等就前进
if j == n:
res.append(i-n+1) #直到和S等长,把这个初始位置记录到res里
j = pnext[j] #这步相当于再回溯,其实是为了继续找新的pattern
return len(res)
#建立一个pnext回溯前缀表,指S里的前缀和后缀拆分到底以后有多少相同的元素
def getnext(self, s):
n = len(s)
pnext = [0, 0] #没太理解网上教的-1之类的,初始化两个0,因为前两位是不可能有其他值的
j = 0 #如果只初始化一个0,在匹配函数里j = -1
for i in range(1, n):
while j > 0 and s[i] != s[j]:
j = pnext[j] # s[j] != s[i]的话j一直是0位,等待相等了以后再往出走
if s[j] == s[i]:
j += 1
pnext.append(j)
return pnext
# write code here
if __name__ == '__main__':
s = Solution()
print(s.kmp("ababab","abababab"))
总结
分享:
只有跳出常规思维,才能化腐朽为神奇;只有多思,智慧的火花才能四溅飞扬,奔跑中的人才能卓尔不群。没有自己思想的生灵如同朽木和僵尸。每个人都应该在心中种上一棵属于自己的心灵常青树。