KMP 最优字符串查找算法

可惜我就是讲不明白 , 直接上书   ,见图片附件 ,手机 500M 像素 蛮清楚的

 

import java.util.Arrays;

/**
 * User: yiminghe
 * Date: 2009-2-19
 * Time: 16:37:57
 */
public class Kmp {


    /**
     * index[i]  越小 ,滑动越多,匹配速度越快
     *
     * @param pattern
     * @return
     */
    private static int[] getFail(String pattern) {


        int[] index = new int[pattern.length()];
        index[0] = -1;
        int lengthP = pattern.length();

        for (int i = 1; i < lengthP; i++) {

            int cf = index[i - 1];
            while (pattern.charAt(cf + 1) != pattern.charAt(i) && cf >= 0) cf = index[cf];
            if (pattern.charAt(cf + 1) == pattern.charAt(i)) index[i] = cf + 1;
            else index[i] = -1;
        }
        return index;
    }

    public static int kmpFind(String target, String pattern) {
        int posP = 0;
        int posT = 0;
        int lenP = pattern.length();
        int lenT = target.length();
        int[] index = getFail(pattern);
        while (true) {
            while (posT < lenT && posP < lenP && target.charAt(posT) == pattern.charAt(posP)) {
                ++posT;
                ++posP;
            }
            if (posP == lenP) {
                return posT - lenP;
            }
            if (posT == lenT) return -1;
            if (posP == 0) ++posT;
            else
                posP = index[posP - 1] + 1;


        }
    }


    public static void main(String[] args) {
        //字符串从左开始1
        System.out.println(kmpFind("acabaabaabcacaabc", "abaabcac"));
    }
}
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值