力扣:找出字符串中第一个匹配项的下标(kmp算法)java

力扣:找出字符串中第一个匹配项的下标kmp算法(java)
在这里插入图片描述
疑难点:
1.如何生成next数组
①初始化 设置j为前缀表的起始位置0,i为后缀表的起始位置1,并赋值next[0]=0。
②设置循环,遍历模式串的后缀表。
③不相等时 循环内,再设置循环判断j的值和i的值不相等情况的回退操作(j = next[j-1])
④相等时 对j进行加一操作。
⑤赋值 对next[i] = j。(在使用next数组时,这一步更改为判断j是否等于模式串的长度)
2.为什么回退操作是个循环操作?
每次回退后还要在进行一次判断是否相等,要在回退过程中不断判断位置。

class Solution {
    public int strStr(String haystack, String needle) {
        if(haystack.length() == 0){//当文本串为空时,返回-1
            return-1;
        }
        if(needle.length()>haystack.length()){//当文本串长度小于模式串时,返回-1
            return-1;
        }
        int[] next = new int[needle.length()];//创建next数组
        getNext(needle,next);//调用创建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];//该回退操作是不对next加一减一的回退操作
            }
            if(haystack.charAt(i) == needle.charAt(j)){//相等时
                j++;
            }
            if(j == needle.length()){//模式串全部符合时
                return i-needle.length()+1;//返回下标
            }
        }  
        return -1;//不存在返回-1
    }
    public void getNext(String needle,int[] next){//获取next数组
        int j=0;//初试化前后缀的指针
        next[0] = 0;
        for(int i = 1; i < needle.length();i++){//遍历后缀
            while(j>0&&needle.charAt(i) != needle.charAt(j)){//前后缀不相等进行回退
                j = next[j-1];
            }
            if(needle.charAt(i)== needle.charAt(j)){//相等,对前缀指针加一
                j++;
            }
            next[i] = j;//对next数组赋值
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值