KMP算法以及next数组(详细易懂版)

简介: KMP算法以及next数组(详细易懂版)

今天也是学习了KMP算法,由于next数组有三种模型,刚开始让我很是错乱,因为当时不知道,后来才发现原来next数组的版本有三种,让我纠结了好久,下面是next数组的三种模型。


1.png



b93a05b6e09e90439b0155ef68f1dd46.png


6f7a40c4cd9e6fef2884436d454c573a.png



刚开始我学的是第一种,那个是最大前缀,求next数组的时候应该不复杂,到时到kmp主函数的时候可能会变复杂,这一种我是在知乎上看到的,这位博主讲的很好,我直接理解了kmp的原理以及最大前缀的作用,链接如下:(4 封私信 / 56 条消息) 如何更好地理解和掌握 KMP 算法? - 知乎 (zhihu.com)


但是这位博主的编程语言用的是python,而我没有学过python,看着确实不舒服,于是乎我又在csdn上找了几篇文章,随后我看到了一篇好文章,这篇文章讲解的是第二种next数组,也是最常用的一个版本,讲的很好,我本来不愿舍弃刚理解的第一种,不过这种算法还是大众常用的比较好:(69条消息) KMP算法图文详解(为什么是next[0]=-1、next[j]=k和k=next[k])_快乐江湖的博客-CSDN博客_kmp算法


这位博主写的代码确实让我收获了不少,对于kmp也是增进了很多理解,总算学会了,下面是我对代码的一些理解,原理大家就看上面的两篇文章吧

class Solution {
public:
int* kmp(string str)
   {
     int* next = new int[str.size()];
     int k = -1;//这里k==-1,是为了和第十行和第15行相呼应,好进行回溯。
     int j = 0;
     next[0] = -1;//next==-1也是与15行相呼应,能够进行回溯的处理。
     while(j<str.size()-1){
         if(k == -1||str[j] == str[k]){//这里是让j动起来如果相等的话就同时前进
             j++;
             k++;
             next[j] = k;//对next数组进行赋值,注意我是第二种next数组
         }
         else k = next[k];//这里是回溯
     }
     return next;
   }
    int strStr(string haystack, string needle) {
        if(haystack.size()<needle.size()){
            return -1;
        }
        int* next = new int [haystack.size()];
        int i = 0;
        int j = 0;
        int sum = needle.size();//这里我建立了一个变量,因为.size()不能直接与负数比较
//这点我写题目的时候困扰了好久找不出问题,后来还是一直调试才发现j==-1时while函数就不进入循环了
        next = kmp(needle);
        while(i<haystack.size()&&j<sum){
            if(j==-1||haystack[i]==needle[j]){//这里跟next数组的建立有异曲同工之妙
//很类似,大家可以编写两个字符串来验证这个流程,在一步一步的迭代中你们就会慢慢懂得这一串代码
//为什么这样写了
                i++;
                j++;
            }
            else j = next[j];//回溯
        }
        if(j>=needle.size()){
            return i-needle.size();//这里是返回下标
        }
        else return -1;//未找到返回-1;
    }
};


总的来说算法这种东西,你会了就真的觉得简单,不会就会觉得很难,但是只要你肯花时间,我相信再难也可以搞懂的。















相关文章
|
1天前
|
算法 搜索推荐 程序员
第六十三练 字符串匹配 - KMP算法
第六十三练 字符串匹配 - KMP算法
6 2
|
1天前
|
搜索推荐 算法 Java
滚雪球学Java(29):数组长度和排序算法:让你的程序更高效
【5月更文挑战第4天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
10 0
滚雪球学Java(29):数组长度和排序算法:让你的程序更高效
|
1天前
|
存储 算法 Java
数据结构与算法 数组和链表
数据结构与算法 数组和链表
11 0
|
1天前
|
存储 算法
Leetcode 30天高效刷数据结构和算法 Day1 两数之和 —— 无序数组
给定一个无序整数数组和目标值,找出数组中和为目标值的两个数的下标。要求不重复且可按任意顺序返回。示例:输入nums = [2,7,11,15], target = 9,输出[0,1]。暴力解法时间复杂度O(n²),优化解法利用哈希表实现,时间复杂度O(n)。
21 0
|
1天前
|
自然语言处理 算法
KMP算法(A + B for you again—HDU - 1867 )
KMP算法(A + B for you again—HDU - 1867 )
|
1天前
|
算法 JavaScript 前端开发
贪心算法】按要求补齐数组
贪心算法】按要求补齐数组
10 0
|
1天前
|
存储 算法
图解Kmp算法——配图详解(超级详细)
图解Kmp算法——配图详解(超级详细)
|
1天前
|
算法
算法系列--两个数组的dp问题(2)(下)
算法系列--两个数组的dp问题(2)(下)
20 0
|
1天前
|
算法
算法系列--两个数组的dp问题(2)(上)
算法系列--两个数组的dp问题(2)
16 0
|
1天前
|
存储 算法
算法系列--动态规划--⼦数组、⼦串系列(数组中连续的⼀段)(1)(下)
算法系列--动态规划--⼦数组、⼦串系列(数组中连续的⼀段)(1)
19 0

热门文章

最新文章