KMP算法——字符串匹配

自己的笔记:

nextval[]规则:

= -1 ① j = 0 目标子串的首位;② T[j] = T[0] 且j之前没有与开头相同的字符;③  T[j] = T[0] 且j之前有与开头相同的字符,但j位本身也在相同子串之内。

= k j之前k位与开头k位相同,但j位本身也在相同子串之内。

= 0 其余情况 (注:j位本身也在相同子串之内,且不跟首位相同,值为0)

若比较到j位出现不等时,next[j] = -1 则 j = 0, i =+ 1; next[j] != -1 则 j = next[j], i不变。

—————————————————————-

java实现和改进:http://blog.sina.com.cn/s/blog_85b0ae450101j2iy.html

http://blog.csdn.net/pony_maggie/article/details/37832707

《KMP算法——字符串匹配》

http://blog.csdn.net/lin_bei/article/details/1252686

定义


1

next[0]= -1 
意义:任何串的第一个字符的模式值规定为
-1


2

next[j]= -1   
意义:模式串
T
中下标为
j
的字符,如果与首字符
相同,且
j
的前面的
1—k
个字符与开头的
1—k
个字符不等(或者相等但
T[k]==T[j]
)(
1

k<j
)。
如:
T=”abCabCad” 

 next[6]=-1
,因
T[3]=T[6]

3

next[j]=k    
意义:模式串
T
中下标为
j
的字符,如果
j
的前面
k

字符与开头的
k
个字符相等,且
T[j] != T[k] 

1

k<j
)。
                       

T[0]T[1]T[2]
。。。
T[k-1]==
T[j-k]T[j-k+1]T[j-k+2]…T[j-1]

T[j] != T[k].

1

k<j

;
(4) next[j]=0   
意义:除(
1
)(
2
)(
3
)的其他情况。  
举例

01


T=

abcac
”的模式函数的值。
     next[0]= -1 
根据(
1

     next[1]=0   
根据
 (4)   
因(
3
)有
1<=k<j;
不能说,
j=1,T[j-1]==T[0]
     next[2]=0   
根据
 (4)   
因(
3
)有
1<=k<j;

T[0]=a

!=

T[1]=b

     next[3]= -1 
根据
 (2)
     next[4]=1   
根据
 (3) T[0]=T[3] 

 T[1]=T[4]
    

   

下标 0 1 2 3 4
T a b c a c
next -1 0 0 -1 1


T=

abcab
”将是这样:

下标 0 1 2 3 4
T a b c a b
next -1 0 0 -1 0

为什么
T[0]==T[3],
还会有
next[4]=0


因为
T[1]==T[4], 
根据
 (3)” 

T[j] != T[k]”
被划入(
4
)。
02
)来个复杂点的,求
T=”ababcaabc” 
的模式函数的值。
next[0]= -1    
根据(
1

         next[1]=0    
根据
(4)
         next[2]=-1   
根据
 (2)
next[3]=0   
根据
 (3) 

T[0]=T[2] 

T[1]=T[3] 
被划入(
4

next[4]=2   
根据
 (3) T[0]T[1]=T[2]T[3] 

T[2] !=T[4]
next[5]=-1 
根据
 (2) 
next[6]=1   
根据
 (3) T[0]=T[5] 

T[1]!=T[6]
next[7]=0   
根据
 (3) 

T[0]=T[6] 

T[1]=T[7] 
被划入(
4

next[8]=2   
根据
 (3) T[0]T[1]=T[6]T[7] 

T[2] !=T[8]
 

下标 0 1 2 3 4 5 6 7 8
T a b a b c a a b c
next -1 0 -1 0 2 -1 1 0 2

只要理解了
next[3]=0
,而不是
=1

next[6]=1
,而不是
= -1

next[8]=2
,而不是
= 0
,其他的好象都容易理解。
03)
   
来个特殊的,求
 T=”abCabCad” 
的模式函数的值。

下标 0 1 2 3 4 5 6 7
T a b C a b C a d
next -1 0 0 -1 0 0 -1 4

         
next[5]= 0 
根据
 (3) 

T[0]T[1]=T[3]T[4],

T[2]==T[5]
next[6]= -1 
根据
 (2) 
虽前面有
abC=abC,

T[3]==T[6]
next[7]=4   
根据
 (3) 
前面有
abCa=abCa,

 T[4]!=T[7]

T[4]==T[7]
,即
T=” adCadCad”,
那么将是这样:
next[7]=0, 
而不是
= 4,
因为
T[4]==T[7].

下标 0 1 2 3 4 5 6 7
T a d C a d C a d
next -1 0 0 -1 0 0 -1 0

 
如果你觉得有点懂了,那么
练习:求
T=”AAAAAAAAAAB” 
的模式函数值,并用后面的求模式函数值函数验证。
意义

 next 
函数值究竟是什么含义,前面说过一些,这里总结。
设在字符串
S
中查找模式串
T
,若
S[m]!=T[n],
那么,取
T[n]
的模式函数值
next[n],
1.
       
next[n]= -1 
表示
S[m]

T[0]
间接比较过了,不相等,下一次比较
 S[m+1] 

T[0]
2.
       
next[n]=0 
表示比较过程中产生了不相等,下一次比较
 S[m] 

T[0]

3.
       
next[n]= k >0 

k<n, 
表示
,S[m]
的前
k
个字符与
T
中的开始
k
个字符已经间接比较相等了,下一次比较
S[m]

T[k]
相等吗?
4.
       
其他值,不可能。

    原文作者:KMP算法
    原文地址: https://blog.csdn.net/xn_28/article/details/52365151
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞