总算把这个东西搞懂了......

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算法学习笔记的更多相关文章

  1. C / C++算法学习笔记(8)-SHELL排序

    原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...

  2. Manacher算法学习笔记 | LeetCode#5

    Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...

  3. Johnson算法学习笔记

    \(Johnson\)算法学习笔记. 在最短路的学习中,我们曾学习了三种最短路的算法,\(Bellman-Ford\)算法及其队列优化\(SPFA\)算法,\(Dijkstra\)算法.这些算法可以快 ...

  4. 某科学的PID算法学习笔记

    最近,在某社团的要求下,自学了PID算法.学完后,深切地感受到PID算法之强大.PID算法应用广泛,比如加热器.平衡车.无人机等等,是自动控制理论中比较容易理解但十分重要的算法. 下面是博主学习过程中 ...

  5. Johnson 全源最短路径算法学习笔记

    Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些 ...

  6. 字符串匹配算法——KMP算法学习

    KMP算法是用来解决字符串的匹配问题的,即在字符串S中寻找字符串P.形式定义:假设存在长度为n的字符数组S[0...n-1],长度为m的字符数组P[0...m-1],是否存在i,使得SiSi+1... ...

  7. 算法学习笔记——sort 和 qsort 提供的快速排序

    这里存放的是笔者在学习算法和数据结构时相关的学习笔记,记录了笔者通过网络和书籍资料中学习到的知识点和技巧,在供自己学习和反思的同时为有需要的人提供一定的思路和帮助. 从排序开始 基本的排序算法包括冒泡 ...

  8. KMP算法学习

    kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置.常规方法是遍历a的每一个位置,然后从该位置开始和b进行匹配,但是这种方法的复杂度是O(n ...

  9. KMP 算法 学习 整理

    我自己整理的KMP算法的PDF文件:http://pan.baidu.com/s/1o8yKIi2提取密码:8291 别的就不多说啥了,感谢来自海子 博客园的 资料--

  10. KMP算法学习(详解)

    kmp算法又称“看毛片”算法,是一个效率非常高的字符串匹配算法.不过由于其难以理解,所以在很长的一段时间内一直没有搞懂.虽然网上有很多资料,但是鲜见好的博客能简单明了地将其讲清楚.在此,综合网上比较好 ...

随机推荐

  1. 如何设置表格的高度 element 的table 组件

    <el-table :row-style="{ height: '30px' }" :cell-style="{ padding: 0 }" :data= ...

  2. 007使用IDEA开发

    007使用IDEA开发 1.什么叫IDE? 集成开发环境(IDE,Integrated Development Environment)是用于提供程序开发环境的应用程序,一般包括代码编辑器.编译器.调 ...

  3. weblogic session timed out

    How to Configure Session Timeout in Weblogic Server (WLS) ?

  4. loadrunner之录制脚本

    LoadRunner是一款性能测试软件,通过模拟真实的用户行为,通过负载.并发和性能实时监控以及完成后的测试报告,分析系统可能存在的瓶颈,LoadRunner最为有效的手段之一应该就是并发控制,通过在 ...

  5. unidbgrid按回车键切换到右侧CELL

    打开UniDBGrid的ClientEvents->ExtEvents属性,编辑Ext.grid.Panel的reconfig函数,输入如下代码就可以实现当UniDBGrid表格的ReadOnl ...

  6. 人人皆可虚拟,直播还能这么玩?声网推出 MetaLive 元直播解决方案

    视频群聊.在线社交.电商带货.游戏竞技.......越来越多的场景融入了直播这一功能.无可厚非,直播可以拉近人与人间的距离,让彼此间的交流更具象.但传统直播场景更为强调主播个人的表现,用户多以围观.刷 ...

  7. 【读书笔记】Young Tableau_Calculus of tableaux_bumping and sliding

    目录 bumping Schensted bumping algorithm 举例 sliding/digging a hole 一些定义 Schiitzenberger sliding algori ...

  8. Java面试——SQL语句题

    更多内容,前往IT-BLOG 一.行转列问题 现有表格A,按照以下格式排列: 姓名 收入类型 收入金额 Tom 年奖金 5w Tom 月工资 10k Jack 年奖金 8w Jack 月工资 12k ...

  9. Synchronized和Volatile的对比

    Synchronized和Volatile是并发中的两大关键字,有相似性和不同点. Synchronized更详细介绍参考https://www.cnblogs.com/spark-cc/p/1706 ...

  10. WebDriver API及对象识别技术

    html页面的iframe的切换: iframe框架在html页面:实际就是多个html页面的相互嵌套:如果存在多个,则操作对象一直停留在主文档页面:    如果需要操作子文档页面则需要实现ifram ...