简单的KMP的next、nextval数组求解办法(存档自己用来复习)

简介: 简单的KMP的next、nextval数组求解办法(存档自己用来复习)

前言

在学习串这一章节时,只有KMP算法让人伤脑筋,它的代码对我来说有种就差一点就能通透的感觉(现在是2024/4/7/还没彻底通透).

那就先放一下,这章的主要考点是求next数组和优化后的nextval数组,所以本篇只讲怎么求

本篇都是以坐标从1开始的串为例

干货

next数组

一个公式:next[j] = j左边子串的匹配数+1

所谓的匹配就是前面(必须包含首字符)和后面(必须包含尾字符)重复的最长子串的长度,类似"a"、“ab”、"ba"这种视为匹配数为0(了解意思就好)

看不懂?没关系

实操一下

假设一个串是“ababaaababaa”(假设字符坐标从1开始),next[1]=0。

“|”左边是匹配的子串,“|”右边是匹配失败的那个字符。

  • next[2]=? a|b… “|”的左边只有一个字符a,所以匹配数为0,next[2]=0+1=1;
  • next[3]=? ab|a… “|”的左边有两个字符,ab只有自身可以匹配,所以匹配数为0,next[3]=0+1=1;
  • next[4]=? aba|b… “|”的左边有三个字符,aba的最前面1个和最后面1个字符匹配,所以匹配数为1,next[4]=1+1=2;
  • next[5]=? abab|a… “|”的左边有abab四个字符,abab前两个和后两个匹配,匹配数为2,next[5]=2+1=3;
  • next[6]=? ababa|a… “|”的左边有ababa五个字符,ababa前3个和后3个匹配,匹配数为3,next[6]=3+1=4;
  • next[7]=? ababaa|a… “|”的左边有ababaa六个字符,ababaa最前面1个和最后面1个字符匹配,匹配数为1,next[7]=1+1=2;…
  • 剩下的推理方式相同

最后得到的结果是:

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2 3 4 5 6

注意:在题目中的next数组是否整体-1要根据题意判断,如果串的坐标从0开始的就要-1,没说就都算对,上面的结果是串的坐标从1开始

nextval数组

想要求解KMP算法优化后求解的nextval数组,需要以前面的next数组为基础

  • 第一步:j=1时,nextval[j]=next[1]=0
  • 第二步:记住一个公式

j>1{Pj=Pnext[j],则nextval[j]=next[j]Pj=Pnext[j],则nextval[j]=nextval[next[j]]

其中Pj是第 j 个字符

实操一下

以前面已求出来next数组的为例

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2 3 4 5 6

image.png

最后的结果如下:

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2 3 4 5 6
nextval 0 1 0 1 0 4 2 1 0 1 0 4

over~

后续有需要的话再补充

相关文章
|
7月前
|
索引
力扣随机一题 6/26 哈希表 数组 思维
力扣随机一题 6/26 哈希表 数组 思维
43 0
|
6月前
链表6(法二好理解)------ 7-6 sdut-C语言实验-有序链表的归并分数 20
链表6(法二好理解)------ 7-6 sdut-C语言实验-有序链表的归并分数 20
30 0
|
6月前
sdut 链表6-------7-6 sdut-C语言实验-有序链表的归并
sdut 链表6-------7-6 sdut-C语言实验-有序链表的归并
21 0
|
6月前
链表4(法二)------7-4 sdut-C语言实验-单链表中重复元素的删除
链表4(法二)------7-4 sdut-C语言实验-单链表中重复元素的删除
35 0
Leetcode-每日一题1250. 检查「好数组」(裴蜀定理)
版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/weixin_46618592/article/details/129038912?spm=1001.2014.3001.5502
139 0
Leetcode-每日一题1250. 检查「好数组」(裴蜀定理)
|
算法
【Day19】LeetCode算法刷题(附带解题思路、代码注释详细) 【777. 在LR字符串中交换相邻字符】 【54. 螺旋矩阵】
学习了解附带解题思路、代码注释详细) 【777. 在LR字符串中交换相邻字符】 【54. 螺旋矩阵】。
126 0
【Day19】LeetCode算法刷题(附带解题思路、代码注释详细) 【777. 在LR字符串中交换相邻字符】 【54. 螺旋矩阵】
|
存储 算法 C语言
想要去欺负Leetcode的这些年——第二次,看看咱们是怎么把数组玩转,把数列理解透彻的~
想要去欺负Leetcode的这些年——第二次,看看咱们是怎么把数组玩转,把数列理解透彻的~
149 0
想要去欺负Leetcode的这些年——第二次,看看咱们是怎么把数组玩转,把数列理解透彻的~
|
C语言
牛客网带你刷 · C语言 | 有序序列判断
问:输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)
209 0
牛客网带你刷 · C语言 | 有序序列判断
LeetCode每日一题——532. 数组中的 k-diff 数对
给定一个整数数组和一个整数 k,你需要在数组里找到 不同的 k-diff 数对,并返回不同的 k-diff 数对 的数目。
75 0