#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 计算模板串S在文本串T中出现了多少次
# @param S string字符串 模板串
# @param T string字符串 文本串
# @return int整型
#
class Solution:
def kmp(self , S , T ):
def getnext(S):
'''
计算next数组是KMP算法的核心,当模式串中有重复子串时有加速作用
用于存放前面已经匹配的子字符串的字符数量,回溯时仅需选取最长的一个开始
'''
# next中为-1表示还未出现从头开始的重复子串
# 非-1的值加一:表示作为重复子串的当前已经匹配的子字符串的字符数量
n = len(S)
Next = [-1] * n
j = -1
for i in range(1, n):
while(j >= 0 and S[i] != S[j + 1]):
# 计算新的一次匹配时,可以先查看前面已经匹配了多少个字符
# 若为-1,则表示没有一个字符已经匹配,则需要从模式串的第一个字符开始匹配
j = Next[j]
if S[i] == S[j + 1]:
j += 1
Next[i] = j
return Next
sn, tn = len(S), len(T)
if tn < sn: return 0
Next = getnext(S)
r = 0
j = -1 # 默认从模式串第一个字符开始寻找
for i in range(tn): # 遍历字符串的长度
while j >= 0 and T[i] != S[j + 1]:
# 查看是否需要从模式串第一个字符开始匹配
# 若是Next[j]的值是-1,则需要
j = Next[j] # 若存在不匹配的字符,则从next数组中取出字符下标进行回溯
# 若当前字符与模式串匹配,则匹配的模式串字符数加一
if T[i] == S[j + 1]:
j += 1
# 达到模式串长度,则出现一次匹配,累加一次
if j + 1 == sn:
r += 1
# 计算新的一次匹配时,可以先查看前面已经匹配了多少个字符
# 若为-1,则表示没有一个字符已经匹配,则需要从模式串的第一个字符开始匹配
j = Next[j]
return r
KMP算法
最新推荐文章于 2022-11-03 21:50:23 发布