首页 > 编程语言 >kmp算法的理解与记忆

kmp算法的理解与记忆

时间:2024-01-14 09:11:53浏览次数:26  
标签:int needle next ++ 算法 记忆 kmp haystack size


首先有两步,1求next数组,2进行比对。
我这种是数组后移的方法,即第一个数是-1。
步骤就是如果前后缀不相等,j就要后撤,要后撤因此要有范围。j>=0;
如果相等就j++;
每一次循环求出对应的next[i]。
要注意的点是因为我这是数组后移的方法,因此比较用next[j+1]比较。
2比对跟求next差不多
首先是对目标串进行遍历
不相等就后撤,相等就++;
当j==size()-1时,则匹配成功。

点击查看代码
class Solution {
public:
void getnext(int *next,const string&s){
    int j=-1;
    next[0]=j;
    for(int i=1;i<s.size();i++){
    while(j>=0&&s[i]!=s[j+1]){
        j=next[j];
    }
    if(s[i]==s[j+1]){
        ++j;
    }
    next[i]=j;
    }
}
    int strStr(string haystack, string needle) {
int next[needle.size()];
getnext(next,needle);
int j=-1;
for(int i=0;i<haystack.size();i++){
    while(j>=0&&haystack[i]!=needle[j+1]){
        j=next[j];
    }
    if(haystack[i]==needle[j+1]){
        ++j;
    }
    if(j==needle.size()-1){return i-needle.size()+1;}
}
return -1;
    }
};

标签:int,needle,next,++,算法,记忆,kmp,haystack,size
From: https://www.cnblogs.com/yun-che/p/17963354

相关文章

  • 一套模板搞定二叉树算法题--二叉树算法讲解002
    1、二叉树的递归递归:2、二叉树遍历之DFS深度优先遍历2.1、遍历的概念每个节点都要恰好被访问一次,本质上是二叉树的线性化。一个树形的结构,线性化为一个数组之类的"串"的结构。2.2、DFS深度优先遍历示例二叉树原型图:2.2.1、前序遍历前序遍历执行顺序:根节点--对左子......
  • 2024/1/13 算法笔记
    1.二分查找的原则当要查找的值target>mid就在mid和right中查找当要查找的值target<mid就在left和mid中查找对于边界条件的处理:while(l<r)mid的取值是[l,r)重点是下面部分,直接决定使用哪个二分模板。1.3中间值归属问题这个问题其实比较灵活,这里我只讨论3种情况,其余情况......
  • Openharmony 跑 CV 算法
    最近有个项目,老同学让帮忙验证一个在ARM板上跑OpenHarmony,然后再集成一个CV算法上去,写这个文章主要是整理一下思路。如果有思路不对的地方,也烦请指出。1.个人做纯软件比较多,所以想着先不用板子,找个仿真环境,网上查了下,Qemu这个工具挺主流,那就先选它了,先跑起来这个(Ongoing)2.......
  • .NET中的加密算法总结(自定义加密Helper类续)
    .NET中的加密算法总结(自定义加密Helper类续) 1.1.1摘要       相信许多人都使用过.NET提供的加密算法,而且在使用的过程我们必须了解每种加密算法的特点(对称或非对称,密钥长度和初始化向量等等)。我也看到过很多人写过.NET中加密算法总结,但我发现个别存在一些问题,很......
  • 算法练习题-系列一
    目录柯里化实现柯里化函数柯里化函数作用扁平化[双指针]有序数组合并判断一个字符串是否是回文字符串[字符串]两个版本号version1和version2[字符串]版本号大小比较排序['1.45.0','1.5','6','3.3.3.3.3.3.3']=>['1.5','1.45.0','3.3.3.3.3.3','6']给定两个......
  • 【教3妹学编程-算法题】构造限制重复的字符串
    3妹:“太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包”2哥:3妹,什么事呀这么开森。3妹:2哥你看今天的天气多好啊,最近一周都是大晴天,艳阳高照2哥:是啊,天气不冷不热的,很适合生活3妹:据说南方的小土豆都跑到北方滑雪了,哈哈哈哈2哥:泼水成冰好玩是好玩,但是一定要注意防寒哦,看新闻都有......
  • 算法学习Day26组合总和、分割回文串
    Day26组合总和、分割回文串ByHQWQF2024/01/13笔记39.组合总和给定一个无重复元素的数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。candidates中的数字可以无限制重复被选取。说明:所有数字(包括target)都是正整数。解集......
  • 【SPFA】最短路的一种算法
    SPFA算法是在bellman-ford算法基础上优化而来,所以我们先讨论bellman-ford算法bellman-ford算法的核心是‘松弛’。那么什么是松弛呢?以下图为例:假设数组d[i]表示源点s到达结点i的最短路径长度,那么松弛指的就是当d[a]+w<d[b],也就是说,这时候通过a到达b比原来的路径更......
  • (坚持每天写算法)基础算法复习与学习part1基础算法1-7——高精度减法(处理t=1和t>1代码的
    题目:思路:这一道题其实和高精度加法的思路是差不多的,都是使用算式进行模拟。重点:关于代码怎么写,在高精度加法那里还看不太出来(我也没有写),但是在高精度减法这里就完全可以看出来了。我们在加法算式里面,一般是A[i]+B[i]+t,但是也可以这么写:t+A[i]+B[i],我们可以先写进位......
  • 文心一言 VS 讯飞星火 VS chatgpt (170)-- 算法导论13.2 3题
    三、用go语言,设在图13-2左边一棵树中,a、b和c分别为子树a、β和γ中的任意结点。当结点x左旋之后,a、b和c的深度会如何变化?文心一言:在二叉树中,左旋操作是改变节点的子节点顺序。原本的子节点β变为新的左子节点,原本的左子节点γ变为新的右子节点。对于给定的节点a、b和c,我们首......