关于KMP算法的重大发现
之前写KMP模板的时候,nx[i]代表最大的一个x,使s[1,x-1]是s[1,i-1]的后缀。(方法1)
然而网上还有另一种方法求nx数组,nx[i]表示最大的一个x,使s[1,x]是s[1,i]的后缀。(方法2)
两种nx数组在具体匹配的时候方法稍有不同,但都能正确匹配字符串。
但是在做字符串DP题的时候,发现网上的题解大多是利用第二种nx数组的性质进行状态的转移。
当时试着写了一下那种nx的求法,但是觉得很别扭,用不惯也记不住。
不知所措。
今天看了一下洛谷的KMP模板(P3375)(传送门),发现得求出第二种nx数组......
这回把第二种求法忘了,也很反感那么写。
于是立志要找出两种方法的联系。
很简单嘛:nx2[i]=nx1[i+1]-1
同时,getnx的时候要走到m+1(m为模式串长),这样nx[m+1]才有值。
给一个洛谷P3375的代码。
注意getnx的改动和最后要求输出nx数组的时候是怎么操作的。
#include<cstdio>
#include<cstring> char s1[],s2[];
int nx[];
int pos[],cnt;
int n,m; void getnx()
{
nx[]=;
for(int i=,j=;i<=m+;)
{
nx[i]=j;
while(j&&s2[i]!=s2[j])j=nx[j];
i++,j++;
}
} void kmp()
{
for(int i=,j=;i<=n;)
{
while(j&&s1[i]!=s2[j])j=nx[j];
if(j==m)
{
pos[++cnt]=i-m+;
j=nx[j];
}
else i++,j++;
}
} int main()
{
scanf("%s",s1+);
scanf("%s",s2+);
n=strlen(s1+);
m=strlen(s2+);
getnx();
kmp();
for(int i=;i<=cnt;i++)printf("%d\n",pos[i]);
for(int i=;i<=m;i++)printf("%d ",nx[i+]-);
return ;
}
关于KMP算法的重大发现的更多相关文章
- 查找子字符串----KMP算法深入剖析
假设主串:a b a b c a b c a c b a b 子串:a b c a c 1.一般匹配算法 逐个字符的比较,匹配过程如下: 第一趟匹配 a b a b c a b c a c ...
- 简单有效的kmp算法
以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...
- 数据结构与算法JavaScript (五) 串(经典KMP算法)
KMP算法和BM算法 KMP是前缀匹配和BM后缀匹配的经典算法,看得出来前缀匹配和后缀匹配的区别就仅仅在于比较的顺序不同 前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从 左到右 后缀匹配 ...
- 扩展KMP算法
一 问题定义 给定母串S和子串T,定义n为母串S的长度,m为子串T的长度,suffix[i]为第i个字符开始的母串S的后缀子串,extend[i]为suffix[i]与字串T的最长公共前缀长度.求出所 ...
- 字符串模式匹配之KMP算法图解与 next 数组原理和实现方案
之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 ...
- 算法:KMP算法
算法:KMP排序 算法分析 KMP算法是一种快速的模式匹配算法.KMP是三位大师:D.E.Knuth.J.H.Morris和V.R.Pratt同时发现的,所以取首字母组成KMP. 少部分图片来自孤~影 ...
- BF算法与KMP算法
BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的 ...
- KMP算法-next函数求解
KMP函数求解:一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为KMP算法.KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串 ...
- 经典KMP算法C++与Java实现代码
前言: KMP算法是一种字符串匹配算法,由Knuth,Morris和Pratt同时发现(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.比 ...
随机推荐
- 吴裕雄--天生自然 PYTHON3开发学习:列表
list1 = ['Google', 'Runoob', 1997, 2000]; list2 = [1, 2, 3, 4, 5 ]; list3 = ["a", "b& ...
- 吴裕雄--天生自然 PYTHON3开发学习:基础语法
#!/usr/bin/python3 # 第一个注释 print ("Hello, Python!") # 第二个注释 #!/usr/bin/python3 # 第一个注释 # 第 ...
- java截取字符串并拼接
一.substirng public static void main(String[] args) { String sendContent = "请查收:www.baidu.com&qu ...
- iPhoneX的后遗症要持续多久?
iPhone X的推出算得上苹果历史上的大事件,这款梳着刘海头型的手机作为iPhone十周年纪念款手机,承载着苹果和整个产业链巨大的希望,正因如此,包括苹果在内的大量企业,把宝都压到了这款手机上.后来 ...
- python爬虫王者荣耀高清皮肤大图背景故事通用爬虫
wzry-spider python通用爬虫-通用爬虫爬取静态网页,面向小白 基本上纯python语法切片索引,少用到第三方爬虫网络库 这是一只小巧方便,强大的爬虫,由python编写 主要实现了: ...
- SQL case when else 语句:选出年份等于1970的,选出的结果用科目和获奖者排序,同时把经济和化学2科放到最后:SELECT * FROM nobel_win WHERE year=1970 ORDER BY CASE WHEN subject IN ('Economics','Chemistry') THEN 1 ELSE 0 END ASC, subject, winner;
SELECT * FROM nobel_win WHERE year=1970 ORDER BY CASE WHEN subject IN ('Economics','Chemistry') THE ...
- dubbo的启动时检查
修改的消费者(xml) 修改的消费者(注解)
- 一、Cookie和Session介绍
会话跟踪 1. 什么是会话 * 用户拨打10086,从服务台接通后会话开始: * 用户发出话费查询请求,服务台响应.这是该会话中的一个请求: * 用户发出套餐变更请求,服务台响应.这是该会话中的 ...
- 吴裕雄--天生自然 JAVA开发学习:抽象类
public abstract class Employee { private String name; private String address; private int number; pu ...
- linux 下c 链接so 库
gcc -shared -fPIC -o libname.so *.c //生成so库 gcc main.c -om -Lpath -lname //链接测试so 库 但是生成可执行程序执行时报 ...