KMP的思路与实现

本文深入讲解了KMP算法的核心思路及实现步骤,包括next数组的计算方法和如何利用next数组进行高效字符串匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路

我就不提为啥有KMP和KMP的原理了,这段跳过。。。
首先计算next数组,算法如下:
输入:String m;
输出:int[] next;
1.next[0]=0;
2.计算next[i]:
    从j=next[i-1]开始,可以得到m[i-1]的next值,辣么如果,m[i]=m[j],说明next[i]=next[i-1]+1(就是多匹配上了一个)
    如果m[i]!=m[j],辣么我们需要去看比j短1的字符串是否匹配上,就是j=next[j-1],知道找到一个m[i]=m[j]或者是匹配到0.
3.输出next

有了next数组,KMP的匹配和计算next数组就惊人的相似了,其实也是一个东西,是不是很神奇~~~
就酱!

Code

public class MyKMP {

    public int kmp(String s, String m) {
        int[] next = kmp(m);
        int j = 0;
        for (int i = 0; i < s.length(); i++) {
            while (j > 0 && s.charAt(i) != m.charAt(j))
                j = next[j];
            if (s.charAt(i) == m.charAt(j))
                j++;
            if (j == m.length()) {
                return i - j + 1;
            }
        }
        return -1;
    }

    public int[] kmp(String m) {
        int[] next = new int[m.length()];
        int len = m.length();
        int i, j = 0;
        next[0] = 0;
        for (i = 2; i < len; i++) {
            while (j > 0 && m.charAt(i) != m.charAt(j)) {
                j = next[j - 1];
            }
            if (m.charAt(i) == m.charAt(j))
                j++;
            next[i] = j;
        }
        return next;
    }

    public static void main(String[] args) {
        String a = "0012345671234567";
        String b = "1234567";
        MyKMP m = new MyKMP();
        System.out.print(m.kmp(a, b));
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值