KMP算法

解题思路已经包含在代码里了


    private int[] getNextArray(char[] chs){  
           int i;//字符数组的下标指示器  
           int k;//最大前后缀
           int[] next = new int[chs.length];  
           for(i = 1,k = 0; i < chs.length; i++){  
                /**
                *   如果 chs[i] == chs[k], 说明最大前后缀相等+1 == next[i],因为前0 ~ k-1与 i-k+1 ~ i-1 是相等的
                *   如果 chs[i] != chs[k],那得算出next[k-1]的最大前后缀,而不是与chs[0~k-1]一个个的比,只要比最大相等前缀就好了
                */
               while(k > 0 && chs[i] != chs[k]){    
                   k = next[k - 1];      
               }
               if(chs[i] == chs[k]){  
                   k++;  
               }  
               next[i] = k;  
           }  
           return next;  
       }  
    public boolean kmp(String str1,String str2){  
        char[] strA = str1.toCharArray();  
        char[] strB = str2.toCharArray();  
        int[] next = getNextArray(strB);    //获取需要匹配子串的next数组  
        int i;  //主串下
        int k;  //最大前后缀
        for(i = 0,k = 0; i < strA.length; i++){  
            // 与next同理,只不过上边是自身相比,这次是主串与子串相比
            while(k > 0 && strA[i] != strB[k])  
                k = next[k-1];  
            if(strA[i] == strB[k]){  
                k++;  
            }  

            if(k == strB.length){  
                return true;  
            }  
        }  
        return false;  
    }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值