KMP算法——字符串匹配

37 篇文章 0 订阅
9 篇文章 0 订阅

自己的笔记:

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






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.         其他值,不可能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值