KMP

  • KMP模式匹配
  • 计算next值:下标从0开始,当j=x,取0-(j-1)的字符,判断前缀和后缀字符是否相等,相等的字符个数
  • 字符的前缀是值不包含最后一个字符在内的所有,
  • 前缀和后缀最大长度为k 的相同前缀后缀
  • 如:t=“aaaaa aab” 当j=4 t4=aaaa 前缀aaa 后缀aaa next=3
public void getNext(String t,int next[]){
        int i;
        i=1;
        next[0]=0;
        while (i <= t.length()-1){
            String subt=t.substring(0,i+1);
            //t[i]后缀的单个字符,t[j]前缀的单个字符
            next[i]=calcMatchValue(subt);
            ++i;
        }
//        System.out.println(next);
    }
private  int calcMatchValue(String subStr) {

        //从最长开始匹配
        int length = subStr.length();
        String preFixStr = subStr.substring(0, length-1);
        String suffFixStr = subStr.substring(1);

        while (preFixStr.length() > 0 && suffFixStr.length() > 0) {
            if (preFixStr.equals(suffFixStr)) {
                return preFixStr.length();
            }

            if (preFixStr.length() == 1 && suffFixStr.length() == 1) {
                break;
            }
            preFixStr = preFixStr.substring(0, preFixStr.length() - 1);
            suffFixStr = suffFixStr.substring(1);
        }

        return 0;
    }
int indexKMP(String s,String t,int pos){
        int i=pos;
        int j=0;
        int[] next=new int[t.length()];
        getNext(t,next);
        while (i <= s.length()-1 && j <= t.length()-1){
            //两字母相等则继续,相对于朴素简单算法增加了j=0的判断
            if(j==0 || s.charAt(i)==t.charAt(j)){
                i++;
                j++;
            }else {
                //j 退回合适的位置,i值不变
                j=next[j];
            }
        }
        if(j== t.length()){
            return i-t.length();
        }else{
            return 0;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值