首页 > 编程语言 >数据结构 —— 串 KMP算法

数据结构 —— 串 KMP算法

时间:2024-02-18 17:12:44浏览次数:23  
标签:子串 字母 next 算法 KMP 数据结构 失配

串很有意思,就是我们认知的 String

 

1.蛮力算法,就是子串一个一个字符对比。

 

2.KMP 算法

时间复杂度 O(m+n)

关键问题在于构造,Next数组。但是,理解到 KMP 算法的前后缀重叠,还是比较快的。

基本思想是,如果目前的字母不匹配,我往前挪动几个字母,可以匹配到一致的?然后把这个距离记下来,每次在某个字母失配的时候,直接挑掉固定的位置。这就是 KMP 算法省时间的方法。

 

通俗理解:第一个遇到的字母记为0,之后再遇到的话,直接+1,例如

abcaaaabc

next = 000123412

 

(1)

 

(2)

 

(3)

 

王道单科书

 

Page 281

1.已知串 S = ‘aaab’ 写出 next 数组

next = 0123

 

2.已知串 S = ‘ababaaababaa’,写出 next 数组

next = 011234223456

解析:

ababaa ababaa

next = 011234 223456

原则一,失配时候,移动到子串的前一个;

原则二,算法永远找到子串最接近的。算法跑的时候,是按照子串重叠的字母数来计算的。

 

第二个字母 b 失配,子串移动到 1 位置,即第一个 a 位置。

第5个 a 失配,移动到 3 号位置,即和第三个 a 对比;第 6 个 a 失配,移动到 4 号位置。因为紧跟着 a ,向前移动到之前【含有 ‘a?’ 的子串】。

 

3.串 S = ‘ababaaababaa’,next 数组

next = -1, 00123 112345

 

4.串 S=‘aabaabaabaac’, P='aabaac'

next = -1,01012 345678

next = -1,01012

 

 

关注 ShoelessCai.com ,值得您的关注! 

标签:子串,字母,next,算法,KMP,数据结构,失配
From: https://www.cnblogs.com/shoelesscai/p/18019591

相关文章

  • 2024牛客寒假算法基础集训营2
    C.TokitsukazeandMin-MaxXOR题解:01Trie观察后发现对序列\(a\)排序并不影响结果然后容易知道,对于\(i<j,a_i\oplusa_j\leqk\),一共有\(2^{i-j-1}\)种序列\(b\)满足条件,特别的,如果\(i=j\),只有\(1\)种满足条件那么现在问题就转换为,我们固定\(a_......
  • 代码随想录算法训练营第十九天 | 98.验证二叉搜索树, 700.二叉搜索树中的搜索,617.合并
     654.最大二叉树 已解答中等 相关标签相关企业 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树......
  • 代码随想录算法训练营第十八天 | 112. 路径总和,113. 路径总和ii ,106.从中序与后序遍
     513.找树左下角的值 已解答中等 相关标签相关企业 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层最左边 节点的值。假设二叉树中至少有一个节点。 示例1:输入:root=[2,1,3]输出:1示例2:输入:[1,2,3,4,null,5,6,n......
  • 算法题记录
    试写一个python程序,求平面直角坐标系中两点的距离:classCoordinate:def__init__(self,x,y):self.x=xself.y=ydefdistance(self,other):x_diff_sq=(self.x-other.x)**2print(x_diff_sq)y_diff_sq=(self.y-other.y)**2......
  • 【算法】007_前缀树和贪心算法
    1.前缀树一个字符串类型的数组arr1,另一个字符串类型的数组arr2.arr2中有哪些字符,是arr1中出现的?arr2中有哪些字符是作为arr1中某个字符串前缀出现的?arr2中有哪些字符是作为arr1中某个字符串前缀出现的?pass:表示当前这个结点被经过的次数end:这个结点作为结尾的次数例如......
  • 路由选择算法简要介绍
    本文仅对LS和DV进行简单的介绍,由于作者初学计算机网络,同时也没有学习图论的知识,若有不妥之处还请指出.一、链路状态算法(LS)特殊量:D(v):直到本次迭代,从源节点到节点v的最低路径开销p(v):从源到v沿着当前最低开销路径的前一节点N':已确定最短路径的节点集c(a,b):两......
  • day28 回溯算法part4 代码随想录算法训练营 78. 子集
    题目:78.子集我的感悟:看见弹幕是秒了,我有点不敢相信,自己试了试,没有通过,再看了一眼文字讲解。感觉懂了点理解难点:这题可以没有终止条件,开始我就疑惑这个终止条件怎么写注意这个nums[i]要添加进入是可以不写终止的,不会出现无线递归的,因为是从i+1开始,那会不会越界??,不会,最......
  • 今天练习2-回溯算法-93. 复原 IP 地址
    注意点&感悟:加油!题目链接:93.复原IP地址自己独立写的代码:classSolution:defrestoreIpAddresses(self,s:str)->List[str]:res=[]self.backtracking(s,0,[],res)returnresdefbacktracking(self,s,start_index,path,res......
  • 今天练习-回溯算法-93. 复原 IP 地址
    注意点&感悟:难吗?不难。难的是克服畏难的心里。题目链接:93.复原IP地址自己独立写的代码:fromtypingimportListclassSolution:defrestoreIpAddresses(self,s:str)->List[str]:res=[]self.backtracking(s,0,[],res)return......
  • day28 回溯算法part4 代码随想录算法训练营 93. 复原 IP 地址
    题目:93.复原IP地址我的感悟:加油!理解难点:开始没理解,start_index的含义start_index是切割后的位置信息。代码难点:代码示例:fromtypingimportListclassSolution:defrestoreIpAddresses(self,s:str)->List[str]:#找3个分割点?#最后......