【无标题】

本文详细介绍了KMP算法的实现过程,包括如何构造next数组以及在getIndexOf方法中利用next数组进行字符串匹配,以提高查找效率。
摘要由CSDN通过智能技术生成

KMP算法模板

public static int getIndexOf(String s1,String s2){
    if (s1 == null || s2 == null||s2.length()<1||s1.length()<s2.length()){
        return -1;
    }

    char[] str1 = s1.toCharArray();
    char[] str2 = s2.toCharArray();

    int x = 0;
    int y = 0;

    int [] next = getNextArray(str2);

    while(x<str1.length&&y<str2.length){
        if (str1[x] == str2[y]){
            x++;
            y++;
        } else if (next[y] == -1){
            x++;
        }else {
            y = next[y];
        }
    }
    return y==str2.length?x-y:-1;

}

public static int[] getNextArray(char[] str2){
    if (str2.length==1){
        return new int[]{-1};
    }
    int[] next = new int[str2.length];
    next[0] = -1;
    next[1] = 0;
    int i = 2; // 目前在i位置上求next数组的值
    int cn = 0;// 当前是cn位置的值在和i-1位置的字符比较
    while (i<next.length){
        if (str2[i-1] == str2[cn]){
            next[i++] = ++cn;// 两层含义  : 1. 值被配上了,2.cn上到下一个该上的位置
        } else if (cn>0){
            cn = next[cn];
        }else {
            next[i++] = 0;
        }
    }
    return next;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leglk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值