KMP算法学习笔记
总算把这个东西搞懂了......
KMP是一个求解字符串匹配问题的算法。
这个东西的核心是一个\(next\)数组,\(next_i\)表示字符串第\(0\sim i\)项的相同的前缀和后缀的最大长度。
这里的前缀和后缀概念略有不同,如 DUCK的前缀为 D,DU,DUC,后缀为 K,CK,UCK,不包含 DUCK本身。
再举一个例子,假设有字符串 DUCKDUCK,则相同的前缀和后缀的最大为 DUCK,因此\(next_7\)值为 \(4\)。
那么怎么求解呢?
对于\(i\),我们知道了\(S_{0\sim next_{i-1}-1}\)和\(S_{i-next_i-1\sim i-1}\)是一样的,如果\(S_{next_{i-1}}=S_i\)就最好,\(next_i=next_{i-1}+1\)。
如果不是怎么办?我们设\(t=next_{i-1}-1\),由于\(S_{0\sim next_{i-1}-1}\)和\(S_{i-next_i-1\sim i-1}\)是一样的,所以在两者的内部,肯定都会有一对长度为\(next_t\)大小的相同的前缀和后缀。
那么,我们考虑新的这个前缀后面等不等于\(s_i\),等于则问题解决,否则故技重施,再找出一个前缀。
可以手动模拟理解一下。
nxt[0]=-1;
for(int i=1;i<m;i++)
{
t=nxt[i-1];
while(t!=-1&&s2[t+1]!=s2[i])t=nxt[t];//前缀不合法,继续找前缀
if(s2[t+1]==s2[i])nxt[i]=t+1;//终于配上了一个前缀
else nxt[i]=-1;//啥也配不上
}
有了这个\(next\)就方便许多了,我们将短的那个字符串的\(next\)算出,如果匹配失败,可以找出前面的,与后缀一样的部分,顶上来匹配,节省时间。
时间复杂度是\(O(|S|)\)的,也就是\(O(n)\)级别。
int i=0,j=0;
while(i<n)
{
if(s[i]==s2[j])
{
i++,j++;
if(j==m)
{
cout<<i-m+1<<endl;
j=nxt[j-1]+1;
}
}
else
{
if(j==0)i++;
else j=nxt[j-1]+1;
}
}
KMP算法学习笔记的更多相关文章
- C / C++算法学习笔记(8)-SHELL排序
原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...
- Manacher算法学习笔记 | LeetCode#5
Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...
- Johnson算法学习笔记
\(Johnson\)算法学习笔记. 在最短路的学习中,我们曾学习了三种最短路的算法,\(Bellman-Ford\)算法及其队列优化\(SPFA\)算法,\(Dijkstra\)算法.这些算法可以快 ...
- 某科学的PID算法学习笔记
最近,在某社团的要求下,自学了PID算法.学完后,深切地感受到PID算法之强大.PID算法应用广泛,比如加热器.平衡车.无人机等等,是自动控制理论中比较容易理解但十分重要的算法. 下面是博主学习过程中 ...
- Johnson 全源最短路径算法学习笔记
Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些 ...
- 字符串匹配算法——KMP算法学习
KMP算法是用来解决字符串的匹配问题的,即在字符串S中寻找字符串P.形式定义:假设存在长度为n的字符数组S[0...n-1],长度为m的字符数组P[0...m-1],是否存在i,使得SiSi+1... ...
- 算法学习笔记——sort 和 qsort 提供的快速排序
这里存放的是笔者在学习算法和数据结构时相关的学习笔记,记录了笔者通过网络和书籍资料中学习到的知识点和技巧,在供自己学习和反思的同时为有需要的人提供一定的思路和帮助. 从排序开始 基本的排序算法包括冒泡 ...
- KMP算法学习
kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置.常规方法是遍历a的每一个位置,然后从该位置开始和b进行匹配,但是这种方法的复杂度是O(n ...
- KMP 算法 学习 整理
我自己整理的KMP算法的PDF文件:http://pan.baidu.com/s/1o8yKIi2提取密码:8291 别的就不多说啥了,感谢来自海子 博客园的 资料--
- KMP算法学习(详解)
kmp算法又称“看毛片”算法,是一个效率非常高的字符串匹配算法.不过由于其难以理解,所以在很长的一段时间内一直没有搞懂.虽然网上有很多资料,但是鲜见好的博客能简单明了地将其讲清楚.在此,综合网上比较好 ...
随机推荐
- Jackson工具类及其配置
1 package com.ruoyi.common.core.utils.json; 2 3 import com.fasterxml.jackson.annotation.JsonAutoDete ...
- WinForm中的MVC模式--MVP模式
本文主要介绍MVC模式在WINFORM中的实现,其实砖家们都称它为MVP模式,小弟E文不太好,真的是记不住那个P怎么拼写的.. MVC模式主要解决的问题就是将表示层和业务层进行分离,在以往做WINFO ...
- 将map转成vo实体
//将map转成vo实体 AssetManagementProductsVO param= JSON.parseObject(JSON.toJSONString(map), AssetManageme ...
- 背景图片 css写法
background: url('../../assets/sj-my.png') no-repeat; background-size: 100% 100%;
- ChatGPT的那些事 -1- 背景资料
ChatGPT的那些事 -1- 背景资料 多处搬运,学无止境 目 录 1 关键词 1 1.1. AIGC(百度百科) 1 1.2. AlphaGo(百度百科) 1 1.3. ChatG ...
- vue 调用 js 获取的今日、本周、本月、本年起始和结束日期
一.得到今天.昨天.明天日期 function getDate(dates) { var dd = new Date(); var n = dates || 0; dd.setDate(dd.getD ...
- HGD2-LSP选择集专题-网络整理
[Visual Lisp]图元选择集专题 图元选择集专题 ;;★★★01.选择集操作★★★ (setq ss (ssadd));;创建一个空选择集 (ssadd (car(entsel)) ss);; ...
- switch case return return 返回不了值的原因
我在页面写了一个ajax ,但是控制器 是 用switch case break 控制的控制器 , 我想 在case login 方法里 直接 return , 但是不好使 始终是 null , ...
- 通过k8s部署服务
一 使用docker运行fastapi程序(python封装http接口) 一 docker commit 1 下载python3的镜像 docker pull python:3.8-slim # s ...
- 在wxpython框架写的GUI中调用GIF格式图片,显示在指定行列的方法
#首先需要从 wx.adv 模块导入 Animation, AnimationCtrl方法 from wx.adv import Animation, AnimationCtrl #然后在面板实现过程 ...