您的位置:首页 > 其它

在KMP基础上添加最大子串匹配功能

2018-03-26 09:31 330 查看
'''
kmp algorithm for string
在字符串匹配的基础上添加了匹配最大长度子串的功能
'''

def match_KMP(target, pattern, pnext):
t_len, p_len = len(target), len(pattern)
i, j = 0, 0
max_pattern = [0]*t_len
while i < t_len and j < p_len:
if j == -1 or target[i] == pattern[j]:
i, j = i+1, j+1
max_pattern[i-1] = j
else:
j = pnext[j]

if j == p_len:
pass
return max_pattern #每个位置都记录target当前已经匹配的最大字符串数目

def gen_pnext(pattern):
p_len = len(pattern)
i, j = 0, 0
pnext = [-1]*p_len
while i < p_len -1:
if j == -1 or pattern[i] == pattern[j]:
i, j = i+1, j+1
if pattern[i] == pattern[j]:
pnext[i] = pnext[j] #如果i, j位置上字符相同,则i+1位置上回退时必然和j+1一致
else:
pnext[i] = j
else:
j = pnext[j]
return pnext

if __name__ == "__main__":
target = "asdfghjlqwerthjyhjlgsdjlra"
pattern = "hjlra"
max_len = 0 #最大长度,用来存放匹配到的最大子串的长度
max_str = 0 #最大子串
for i in range(len(pattern)-1):
pattern = pattern[i:len(pattern)]
pnext = gen_pnext(pattern)
eval1 = match_KMP(target, pattern, pnext)
print(eval1)
print("%d"%max(eval1))
if max(eval1) > max_len: #更新最大长度
max_len = max(eval1)

i = 0
while i < len(target):
if eval1[i] == max_len:
max_str = target[(i - max(eval1) + 1):i + 1]#更新最大子串
i += 1
print(max_str)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kmp 改进