您的位置:首页 > 编程语言 > C语言/C++

KMP-字符串模式匹配(c++/python实现)

2018-03-25 18:05 531 查看

KMP算法可以在O(n+m)的时间数量级上完成模式匹配,其做法在于:没当一次匹配过程中出现字符比较不等时,不需要回溯指针,而是利用已经得到的“部分匹配”的结果将模式向右“滑动”尽可能远的一段距离后,继续进行比较。

在KMP算法中主要是先得到子字符串的next数组,计算next数组方法如下:

(1)、next[1]=0,next[1]=1

(2)、后面求解每一位的next[j]值时,根据j的前一位进行比较,令k=next[j-1];

(3)、将s[j-1]于s[k]进行比较:

  如果相等,则令该next[j]=k+1

  如果不相等,令k=next[k],若k不等于0,跳到(3),否则,next[j]=1

eg:

如下图j=4时,此时前面的next数组为0 1 1,所以k=next[3]=1 ,由于s[j-1]=s[3]=a、s[k]=s[1]=a,所以s[j]=s[4]=1+1=2

如下图j=5时,next={0,1,1,2},k=2,s[j-1]=a,s[k]=b,所以k=next[k]=next[2]=1,此时s[k]=s[1]=a,所以s[j]=s[5]=1+1=2

比如子字符串为:abaabcac,计算如下图

#-*- coding:utf-8 -*-

class KMP:

def __init__(self,s_long,s_short):
self.s_long=s_long
self.s_short=s_short
self.flag=0

def get_nextList(self):
l=[0,1]
for i in range(2,len(self.s_short)):
l.append(self.get_num_1(self.s_short[0:i]))
print l
b=0
a=0
while True:
if self.s_short[a]==self.s_long[b]:
a+=1
b+=1
else:
a=l[a]-1
if a==-1:
a += 1
b += 1
if self.s_short==self.s_long[b:b+len(self.s_short)]:
break
if b==len(self.s_long):
return 0
return b+1

'''
功能(见图2、3):获得子字符串的next数组,和第一张图方法比一样,更容易理解
s:用于存储该字符前面所有的子字符串(注意子字符串是从这个字符串开始从后往前,长度慢慢增长)
while循环:用于确定前面最长重复的字符串(注意,应该从长的开始匹配,且必须从第一个字符开始)
返回最长字符串长度+1
'''
def get_num_1(self,string):
s=[]
for i in range(1,len(string)):
s.append(string[len(string)-i:len(string)])
while s:
temp=s.pop()
n=len(temp)
if temp==string[0:n+0]:
return len(temp)+1
return 1

long=raw_input()
short=raw_input()
print KMP(long,short).get_nextList()
View Code

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: