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月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
38 0
|
1月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
30 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
1月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
21 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
1月前
|
算法
第四章 KMP算法理论基础
第四章 KMP算法理论基础
18 0
|
1月前
|
算法
KMP算法
KMP算法
27 0
|
3月前
|
算法 C++
A : DS串应用–KMP算法
这篇文章提供了KMP算法的C++实现,包括计算模式串的next数组和在主串中查找模式串位置的函数,用于演示KMP算法的基本应用。
|
3月前
|
存储 算法 Java
深入算法基础二分查找数组
文章深入学习了二分查找算法的基础,通过实战例子详细解释了算法的逻辑流程,强调了确定合法搜索边界的重要性,并提供了Java语言的代码实现。
深入算法基础二分查找数组
|
3月前
|
算法
【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
|
3月前
|
算法
KMP算法
KMP算法
27 0
|
3月前
|
算法
【算法】模拟算法——外观数组(medium)
【算法】模拟算法——外观数组(medium)