28、找出字符串中第一个匹配项的下标

本文详细介绍了KMP算法中的前缀表构建过程,以及如何利用next数组进行字符串搜索,包括代码示例。KMP算法用于高效地在长字符串中查找给定模式串。
摘要由CSDN通过智能技术生成

        使用kmp解决。

        kmp流程:构建前缀表-搜索。

前缀表(记录字符串中每个字串最大相等前后缀的长度)构建:

              以aabaaf为例:

                1、‘a'没有前后缀,所以next[0] = 0;

                2、’aa‘,前后缀都为a,所以next[1]=1;

                3、’aab‘,前缀啊,后缀b,没有前后缀,所以next[2]=0;

                4、’aaba‘,最大相等前后缀为a,所以next[3]=1;

                5、’aabaa‘,最大相等前后缀为aa,所以next[4]=2;

                6、’aabaaf‘,最大相等前后缀为0,所以next[5]=0

                

对应前缀表代码

public void getNext(String str, int[] next) {
    int j = 0;
    next[0] = 0;

    //i对应的为模式串中的后缀,从1开始,j表示前缀,从0开始
    //当ij对应相等则j++,否则j--
    for (int i = 1; i < str.length(); i++) {
        while (j > 0 && str.charAt(i) != str.charAt(j))
            j = next[j - 1];

        if (str.charAt(i) == str.charAt(j))
            j++;
        next[i] = j;
    }
}

对应搜索代码

public int strStr(String haystack, String needle) {

    if (haystack.length() == 0)
        return 0;

    int[] next = new int[needle.length()];

    getNext(needle, next);

    int j = 0;

    for (int i = 0; i < haystack.length(); i++) {
        //回退模式串
        while (j > 0 && haystack.charAt(i) != needle.charAt(j)) j = next[j - 1];

        if (haystack.charAt(i) == needle.charAt(j))
            j++;

        if (j == needle.length())
            return i - needle.length() + 1;
    }

    return -1;
}
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值