首页 > 编程语言 >KMP算法

KMP算法

时间:2024-03-30 15:34:09浏览次数:34  
标签:字符 ch nextval ++ next 算法 KMP

对于字符串“abababca”,它的next如下表所示:

图片.png

void get_next(SString T, int* next) {
    int i = 1, j = 0;
    next[1] = 0;    // next[1]的值总是0
    while (i < T.length) { 
        if (j == 0 || T.ch[i] == T.ch[j]) { // 如果j处于0位或者,俩字符相等
            ++i; ++j;   // 继续比较后继字符
            next[i] = j;    // 当前的j就是next的值
        } else {
            j = next[j];    // 若字符不相等,则j利用next[j]进行回溯
        }
    }
}

考试手算:前缀后缀匹配

算法简单的语言描述一下:

  1. 当我们在做KMP算法时,会设置两个指针,i和j。i初始值位1,j初始值位0。
  2. 在KMP算法中,i在算法过程中不会减小且next[1] = 0。
  3. 当j = 0 或者 两个比较的字符相同时,跳过,++i,++j,且此时next[i]的值恰好为j。
  4. 当两个字符不同时,i不发生变化,j回溯到next[j]的位置。

对于字符串“ababaa”,它的next如下表所示:
img

void get_nextval(SString T, int nextval[]) {
    int i = 1, j = 0;
    nextval[1] = 0;
    while(i < T.length) {
        if(j==0 || T.ch[i] == T.ch[j]) {
            ++i; ++j;
            if (T.ch[i] != T.ch[j]) nextval[i] = j;
            else nextval[i] = nextval[j];
        }
        else {
            j = nextval[j];
        }
    }
}

nextval数组解决了,j回溯之后仍然字符不相等的漏洞
考试手算:先求next数组,再求nextval数组

算法简单理解:其实就多了一个检查是否回溯之后仍然无效

标签:字符,ch,nextval,++,next,算法,KMP
From: https://www.cnblogs.com/moguw/p/18105561

相关文章

  • 基于DWT(离散小波变换)的图像加密水印算法,Matlab实现
           博主简介:专注、专一于Matlab图像处理学习、交流,matlab图像代码代做/项目合作可以联系(QQ:3249726188)       个人主页:Matlab_ImagePro-CSDN博客       原则:代码均由本人编写完成,非中介,提供有偿Matlab算法代码编程服务,不从事不违反涉及学术原则......
  • 代码随想录算法训练营第六十天|84.柱状图中最大的矩形
    84.柱状图中最大的矩形刷题https://leetcode.cn/problems/largest-rectangle-in-histogram/description/文章讲解https://programmercarl.com/0084.%E6%9F%B1%E7%8A%B6%E5%9B%BE%E4%B8%AD%E6%9C%80%E5%A4%A7%E7%9A%84%E7%9F%A9%E5%BD%A2.html视频讲解https://www.bilibili.com......
  • 代码随想录算法训练营总结
    刷题收获:    通过算法训练营一刷,熟悉并上手实现了一些算法,代码能力得到了很大的提升,也对提高了Java的熟练度,为研究生阶段参加算法竞赛打下了不错的基础。    并且这种每日打卡的形式,能够强制性让自己每天看算法题,收获自然颇丰,也会有助手大佬帮我解决盯了四个......
  • 面了字节 NLP 算法工程师(含大模型方向),跪了。。。
    节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。汇总合集:《大模型面试宝典》(2024版)发布!......
  • C语言查找-----------BF算法&&KMP算法
    1.问题引入有一个主字符串,有一个子字符串,要求我们寻找子字符串在主字符串里面开始出现的位置;2.BF算法BF算法就是暴力算法,这个做法虽然效率不高,但是按照我们传统的思路依然能够得到结果,接下来我们使用C语言实现这个查找的过程;#include<stdio.h>#include<assert.h>#includ......
  • 动画图解:九大经典排序算法详解-算法宝App
    重新整理了一遍排序算法,结合自己开发的算法宝App的录屏,转成webp动画一起分享给大家,适合新手。概述时间复杂度(timecomplexity)用来描述算法的运行时间。常用大O符号表述。比如:O(n),O(1),O(logn),O(n2)等。举例:O(n)表示线性级复杂度,表示时间复杂度和元素element数量n成正比。......
  • 京东一面挂在了CAS算法的三大问题上,痛定思痛不做同一个知识点的小丑
    写在开头在介绍synchronized关键字时,我们提到了锁升级时所用到的CAS算法,那么今天我们就来好好学一学这个CAS算法。CAS算法对build哥来说,可谓是刻骨铭心,记得是研二去找实习的时候,当时对很多八股文的内容浅尝辄止,很多深奥的知识点只是知道个概念,源码看的也不深,代码量也不够,京东一......
  • 算法进阶课之搜索
    在y总的算法进阶课里,主要讲了BFS和DFS虽然y总将二者又细分成了很多类别(bfs下面有floodfill、最短路模型、最小步数模型……)但个人感觉bfs没有必要分这么多种以下是一些总结:1、bfsvsdfs:前者可以用来求最短(保证第一次搜到的是最短的)但是需要用很多的空间,而且代码相对复杂一些;......
  • 多边形边界扩大算法 基于MATLAB
    首先,通过定义多边形的顶点坐标(在paths、paths1和paths2变量中)和外延大小(extra和extra2变量),确定多边形的形状和外延量。对于每个多边形:使用迭代的方式遍历多边形的每个顶点。对于每个顶点,计算与相邻边的单位向量,并根据指定的外延大小计算扩展向量的长度。使用单位向量和......
  • 一文带你搞懂匈牙利算法
    一文带你搞懂匈牙利算法附赠自动驾驶学习资料和量产经验:链接什么是匈牙利算法最近在研究一个比较有意思的应用—车辆追踪算法。传统的车辆追踪算法是基于检测器检出车辆,之后使用卡尔曼滤波和匈牙利算法来进行位置预测与数据级联的。关于卡尔曼滤波,我之前已经写过一篇文章进行......