KMP算法

1、用字符串1:ABCDABD 去匹配字符串2:DCABCDABEABABCDABCDABDE

2、先找到字符串1ABCDABD的前缀和后缀。 "前缀"指除了最后一个字符以外,一个字符串的全部头部组合;"后缀"指除了第一个字符以外,一个字符串的全部尾部组合。

得到部分匹配表:

字符串前缀后缀前缀与后缀共有字符共有字符长度
A空集空集0
ABBA0
ABCA、ABBC、C0
ABCDA、AB、ABCBCD、CD、D0
ABCDAA、AB、ABC、ABCDBCDA、CDA、DA、AA1
ABCDABA、AB、ABC、ABCD、ABCDABCDAB、CDAB、DAB、AB、BAB2
ABCDABDA、AB、ABC、ABCD、ABCDA、ABCDABBCDABD、CDABD、DABD、ABD、BD、D0

3、进行匹配。

(1)若第一个字符不匹配,则向后移动一个进行下一轮匹配

(2)若第二个字符以上不匹配,移动距离=前面匹配的字符数-前面匹配的字符组成的字符串的共           有字符长度。正经公式是( 移动位数 = 已匹配的字符数 - 对应的部分匹配值)这个部分匹           配值就是共有字符长度

         移动后进行下一轮匹配

例子:用字符串1:ABCDABD 去匹配字符串2:DCABCDABEABABCDABCDABDE

第一次:D不匹配,移动一格

第二次:C不匹配,移动一格

第三次:D与E不匹配,前面已经匹配的字符:ABCDAB查表可知共有字符长度是2,移动位数=6-                2=4,移动4格

第四次:C与E不匹配,前面已经匹配的字符:AB查表可知共有字符长度是0,移动位数=2-                0=2,移动2格

.。。。。依此类推

求最大公共字符串长度的代码(有待理解)

public int[] getNext(String b) 
{ 
    int len=b.length(); 
    int j=0; 
           
    int next[]=new int[len+1];//next表示长度为i的字符串前缀和后缀的最长公共部分,从1开始 
    next[0]=next[1]=0; 
           
    for(int i=1;i<len;i++)//i表示字符串的下标,从0开始 
    {//j在每次循环开始都表示next[i]的值,同时也表示需要比较的下一个位置 
        while(j>0&&b.charAt(i)!=b.charAt(j))j=next[j]; 
        if(b.charAt(i)==b.charAt(j))j++; 
        next[i+1]=j; 
    } 
           
    return next; 
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值