代码随想录Day9 | Kmp算法与字符串总结篇

今天的两道题目我先暂时跳过了,因为我对kmp算法的掌握还不够到位,所以暂时还做不出来,看完题解也不行,我的算法能力还没达到这个层次。

但是我还是想在这里谈谈我对kmp算法的理解,kmp算法的匹配过程大致如下,当当前字符不匹配时,我就需要通过next数组找到它对应的最小公共前后缀的大小,然后让对应的下标指向i的位置,因为在kmp算法中,i指针是不回退的,直到找到为止,这里重点就是如何生成next数组,来看具体代码的实现

class Solution {
public:
    int strStr(string haystack, string needle) {
        int n=haystack.size();int m=needle.size();
        int Next[m+1];Next[0]=-1;
        int i1=0;int j1=-1;
        while(i1<m){
            if(j1==-1 || needle[i1]==needle[j1]){
                i1++;j1++;
                Next[i1]=j1;
            }
            else{
                j1=Next[j1];
            }
        }
        return Next[m-1];
        int i=0;int j=0;
        while(i<n){
            if(j==-1 || haystack[i]==needle[j]){
                i++;j++;
                if(j==m){
                    return i-m;
                }
            }
            else{
                j=Next[j];
            }
        }
        return -1;
    }
};

这里next数组的生成过程类似于kmp算法,举个例子假设字符串为aaaab,一开始我们初始化next数组,也就是next[0]=-1;注意这里我的next[i]代表的是前面的字符串的最长公共前后缀,所以第一个初始化为-1,然后进入while循环,当j==-1, 或者是s[i]==s[j]时,代表在加入i指向的字符后,原来的最长公共前后缀加长了,也就是他的出现使得我的最长公共前后缀变长了一个,所以这时i++;j++;然后让Next[i]=j;如果不相等,让j指针回退也就是j=Next[j];看他与上一个最长公共前后缀相加在一起能能不能构成一个更长的,可以的话,就会i++;j++;然后和上面一样,不行就一直回退,直到j==-1,就赋值成0;大概就是这个意思;

如果以后我完全理解,我会再发一个博客来解释,我现在功力不够,大家见谅!,至于总结篇,我认为最重要的还是双指针法和翻转的技巧,这个就要通过具体的题目复习了。

今天还是有点不爽的,因为这个kmp没怎么弄懂。题目也没写出来,继续加油吧,身为一名优秀的程序员,敢于挑战困难,和克服困难是必须具备的品质!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值