首页 > 编程语言 >kmp算法next数组详解

kmp算法next数组详解

时间:2024-03-17 11:31:48浏览次数:16  
标签:aba 下标 next 算法 详解 数组 kmp 字符串

         kmp算法是一项特别重要的算法,它的难点主要在于next数组的求解。

## 首先

next[i]表示字符串下标i前子字符串(s[0~i-1])的最长相同前后缀的值。

以字符串s="ababbacaba"为例子分析。

前缀:a ab aba abab ababb ababba ababbac ababbaca ababbacab

后缀:a ba aba caba acaba bacaba  bbacaba abbacaba babbacaba

下标0123456789

字符

ababbabaca
next-1001201230

下标为0时前面没有字符串,所以设next[0]=-1

        先展示一下求next数组的代码,随后我们进行反向推理。

int j=-1,i=0;                //next[i]是当前需要求值的next数组。
void Getnext(string s){
    while(i<s.length()){
      if(j==-1||s[i]==s[j]){
        next[++i]=++j;
      }
      else{
        j=next[j];
      }
    }
}

1. 假设当前要求next[k+1],k+1=9,既然要求next[9],说明已知next[8]的值,假设next[8]=4;

即s[0~3]=s[4~7]

(颜色相同的部分代表相等)

2. 如果s[4]=s[8],那么s[0~4]=s[4~8],next[9]=next[8]+1=5                

3.如果s[4]!=s[8],假设next[4]=1;此时s[0]=s[3],由于s[0~3]=s[4~7],所以s[0]=s[3]=s[4]=s[7];

4.如果s[1]=s[8],即next[9]=next[4]+1;

5.如果s[2]!=s[8],next[1]=0;

6.如果s[0]==s[8],next[9]=0+1=1;否则next[9]=-1+1=0;

标签:aba,下标,next,算法,详解,数组,kmp,字符串
From: https://blog.csdn.net/a_colder/article/details/129186756

相关文章

  • HDFSDATANODE数据传输详解
    本文主要阐述datanode中一个socket连接接收字节流的构成,帮助datanode的接收与处理数据。注意hadoop版本为3.1.1。写在前面Datanode本质上也是TCPServer,一般的TCPServer接到客户端请求以后会分配一个线程处理,对于Datanode而言,这个线程可以叫做Op处理连接。每个OP连接会多次和客户......
  • 二分/二分查找(整数二分详解+拓展浮点二分)
    先上题目在一个有序数组中,查找x所在的下标。输入第一行两个整数n和m。第二行n个数,表示有序的数列。接下来m行,每行一个整数x,表示一个询问的数。输出对于每个询问如果x在数列中,输出下标。否则输出-1样例输入15334579738输出141-1提示对于100%的数......
  • ic基础|时序篇06:输入约束set_input_delay与输出约束set_output_delay详解
    大家好,我是数字小熊饼干,一个练习时长两年半的ic打工人。我在两年前通过自学跨行社招加入了IC行业。现在我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结,并通过汇总成文章的形式进行输出,相信无论你是在职的还是已经还准备入行,看过之后都会有有一些收获,如果看......
  • Git常用命令详解
    目录前言操作环境准备工作Linux安装gitgit简介本地控制保证完整性Git一般只添加数据git大致流程本地仓库管理初始化git仓库存到暂存区.gitignore文件提交到本地仓库分支管理新建分支查看分支切换分支合并分支删除分支版本回滚远程仓库管理第三方远程仓库Gitee注册账......
  • Offer必备算法14_哈希表_五道力扣题详解(由易到难)
    目录①力扣1.两数之和解析代码②力扣面试题01.02.判定是否互为字符重排解析代码③力扣217.存在重复元素解析代码④力扣219.存在重复元素II解析代码⑤力扣49.字母异位词分组解析代码本篇完。①力扣1.两数之和1.两数之和难度简单给定一个整数数组 nu......
  • 详解MySQL的MVCC(ReadView部分解析C++源码)
    文章目录1.什么是MVCC2.MVCC核心组成(三大件)2.1MVCC为什么需要三大件3.隐藏字段4.undolog4.1模拟版本链数据形成过程5.ReadView5.1m_ids5.2m_creator_trx_id5.3m_low_limit_id5.4m_up_limit_id5.5可见性分析算法6.MVCC流程模拟6.1RC隔离级别6.2RR隔离......
  • 数据结构知识总结笔记------第四章:串(2)串的简单模式匹配算法、KMP算法、KMP算法的改进
    1、简单模式匹配算法对一个串中某子串的定位操作称为串的模式匹配,其中待定位的子串称为模式串。算法的基本思想:从主串的第一个位置起和模式串的第一个字符开始比较,如果相等,则继续逐一比较后续字符;否则从主串的第二个字符开始,再重新用上一步的方法与模式串中的字符做比较,以......
  • C++类模板与友元详解
    C++模板下面分四种情况分别讨论。1.函数、类、类的成员函数作为类模板的友元函数、类、类的成员函数都可以作为类模板的友元。程序示例如下:void Func1() {  }class A {  };class B{public:    void Func() { }};template <class T>class Tmpl{......
  • C++类模板与继承详解
    C++模板类模板和类模板之间、类模板和类之间可以互相继承。它们之间的派生关系有以下四种情况。1.类模板从类模板派生示例程序:template <class T1, class T2>class A{    Tl v1; T2 v2;};template <class T1, class T2>class B : public A <T2,......
  • WPF中轻松操控GIF动画:WpfAnimatedGif库详解
    概述:在WPF中使用`WpfAnimatedGif`库展示GIF动画,首先确保安装了该库。通过XAML设置Image控件,指定GIF路径,然后在代码中使用库提供的方法实现动画控制。这简化了在WPF应用中处理GIF图的过程,提供了方便的接口来管理动画播放和暂停。当使用 WpfAnimatedGif 库在WPF中显示GIF图动......