首页 > 编程语言 >KMP算法

KMP算法

时间:2023-12-19 11:23:29浏览次数:29  
标签:aa 相等 匹配 前缀 后缀 aabaaf 算法 KMP

用于解决字符串匹配问题

名词解释

前缀表

  1. 前缀:包含首字母不包含尾字母的所有子串
  • 比如aabaaf的前缀有a aa aab aaba aabaa
  1. 后缀:包含尾字母不包含首字母的所有子串
  • 比如aabaaf的后缀有f af aaf baaf abaaf
  1. 最长相等前后缀:比如aabaa,最长的,相等的,前缀和后缀相等,那么这个缀就是aa,长度是2
    | 子串 | 最长相等前后缀长度 |
    | ---- | ----------------- |
    | a | 0 |
    | aa | 1 |
    | aab | 0 |
    | aaba | 1 |
    | aabaa| 2 |
    | aabaaf| 0 |

于是前缀表就是0 1 0 1 2 0

巧妙的地方所在

  1. 最长相等前后缀,一定发生在两端(所以最长相等前后缀是几,就从后往前数几个,不会出现跳过某个的情况)!!!因为前缀要求包含首 后缀要求包含尾
  2. aabaa还可以匹配上,aabaaf匹配不上了,就找到f前面的最长相等前后缀“aa”,也就是说前面也有个aa,那么继续用这个aa匹配
    image
  3. 相当于说,不用KMP,如果aabaaf匹配不上了,需要从索引1开始(第二个位置)继续匹配,但这是无效的,因为首是aa,所以KMP帮你跳到最近的有效位置
  4. 跳到的这个位置'b'下标是多少呢,刚好是2(最长相等前后缀长度)!!!

题解

image
匹配到f发现不匹配了,

标签:aa,相等,匹配,前缀,后缀,aabaaf,算法,KMP
From: https://www.cnblogs.com/xsl-blogs/p/17912897.html

相关文章

  • 【面试官版】【持续更新中】融合滤波算法+数据结构+激光视觉SLAM+C++面试题汇总
    C++部分什么时候需要写虚函数、什么时候需要写纯虚函数?只继承接口为纯虚函数强调覆盖父类重写,或者父类也需要实现一定的功能,为虚函数指针传参和引用传参区别?引用传参本质上是传递原参数地址,指针传参本质还是值传递,生成拷贝指针,拷贝指针和原指针指向的为同一块内存。因此改变......
  • 用MATLAB实现遗传算法程序
    用MATLAB实现遗传算法程序/B2F.m , 658用MATLAB实现遗传算法程序/changes.m , 959用MATLAB实现遗传算法程序/cross.m , 1155用MATLAB实现遗传算法程序/de2bi.m , 1048用MATLAB实现遗传算法程序/F2B.m , 540用MATLAB实现遗传算法程序/f553.m , 538用MATLAB实现遗传算法......
  • 【算法模版】二分查找
    1.简介故事分享......
  • 基于深度学习网络的疲劳驾驶检测算法matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本matlab2022a 3.算法理论概述3.1疲劳检测理论概述      疲劳检测的原理是根据人体疲劳状态下的特征检测,和正常状态下的特征检测做对比。在做疲劳检测之前,首先需要分析人体在疲劳状态下与正常状态下的特征有哪些不......
  • 多尺度retinex图像去雾算法matlab仿真
    1.算法运行效果图预览 2.算法运行软件版本matlab2022a 3.算法理论概述      多尺度Retinex(MSR)图像去雾算法是一种基于Retinex理论的去雾算法。该算法通过在大、中、小三个尺度上计算图像的反射分量,并对其进行加权平均,从而消除雾气对图像的影响,提高图像的可视度......
  • 算法学习Day5 哈希的一天
    Day5哈希的一天ByHQWQF2023/12/13当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。笔记242.有效的字母异位词给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。示例 1:输入:s="anagram",t="nagaram......
  • 代码随想录算法训练营第四天|24.两两交换链表中的节点、19.删除链表的倒数第N个节点、
    LeetCode24.两两交换链表中的节点题目链接: 24.两两交换链表中的节点提示:链表问题,首先用虚拟头节点,让链表节点的处理具有一致性!!! LeetCode19.删除链表的倒数第N个节点题目链接:19.删除链表的倒数第N个节点注意点:快慢指针,链表删除元素得找到该元素的前一个元素!!! LeetCode......
  • 数据结构算法---二叉排序树
    二叉排序树(BinarySearchTree,BST),也称为二叉搜索树或二叉查找树,是一种经典的数据结构,它满足以下性质:对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值。对于树中的每个节点,其右子树中的所有节点的值都大于该节点的值。左子树和右子树也都是二叉排序树。基于这些性......
  • Expectation-Maximization Attention Networks for Semantic Segmentation 使用了EM算
    Expectation-MaximizationAttentionNetworksforSemanticSegmentation*Authors:[[XiaLi]],[[ZhishengZhong]],[[JianlongWu]],[[YiboYang]],[[ZhouchenLin]],[[HongLiu]]DOI:10.1109/ICCV.2019.00926Locallibrary初读印象comment::(EMANet)用期望......
  • 数据结构算法---冒泡排序
    冒泡排序(BubbleSort)是一种简单的排序算法,它重复地遍历要排序的列表,比较相邻两个元素并按照大小交换位置,直到整个列表排序完成。这种排序算法得名于越小的元素会经由交换慢慢"浮"到列表的顶端。下面是冒泡排序的基本步骤:从列表的第一个元素开始,比较它与下一个元素的大小。如果......