KMP算法使用

文章介绍了Solution类中的strStr方法,该方法利用Knuth-Morris-Pratt(KMP)算法在haystack字符串中查找needle子串,通过next数组优化了查找过程。KMP算法是一种高效的字符串匹配算法,适用于处理大量数据。

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

在这里插入图片描述

class Solution {
    public int strStr(String haystack, String needle) {
        if (haystack == null || needle == null || needle.length() < 1 || haystack.length() < needle.length()) {
            return -1;
        }
        int[] next=getNext(needle.toCharArray());
        int i=0; //指向匹配数组的指针   
        int j=0;//指向被匹配数组的指针
        int res=-1;
        while(i<haystack.length()&&j<needle.length()){
            //如果两个字符相等
            if(haystack.charAt(i)==needle.charAt(j)){
                i++;
                j++;
            }else if(j>0){//如果还能往左跳
                j=next[j];
            }else{
                //如果到了next数组0位置则说明没有可以匹配的位置了
                i++;
            }
            //子串已经到达最后了,代表父串中已经出现了一次
            //i和j其实最后都进行了额外的一次++操作

        }
        return j == needle.length()? i -j: -1;
    }
    public static int[] getNext(char[] str) {
        if (str.length == 1) {
            return new int[]{-1};
        }
        int[] next = new int[str.length];
        next[0] = -1;
        next[1] = 0;
        // i: next数组的位置
        int i = 2;
        // j: 要和next[i-1]比较的位置,最长的可能的公共前缀的位置
        int j = 0;
        while (i < next.length) {
            if (str[i - 1] == str[j]) {
                next[i++] = ++j;//如j匹配上了则对于此刻i的最大前缀长度加一同时跳到下一个i位置
            } else if (j > 0) {
                // 当前跳到j位置的字符,和i-1位置的字符配不上,则j继续向前跳,直到跳到最开始0位置,或者匹配上
                j = next[j];
            } else {
                //j跳到头也没匹配上,i++到下一个位置
                next[i++] = 0;
            }
        }
        return next;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值