博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
kmp
阅读量:4493 次
发布时间:2019-06-08

本文共 1579 字,大约阅读时间需要 5 分钟。

还真是写了又忘忘了再写......

 kmp算法用于加速字符串的匹配,优化暴力匹配

文本串 s  "abcaabcabeabcabd"

模式串 t   "abcabd"

t 匹配 s,找 t 在 s 中出现的最早位置

暴力匹配试试

指针i,j 从0开始右移匹配

 

abcaabcabeabcabd

        i
abcabd
        j

此时 s [ i ] 和 t [ j ] 不匹配,j 跳到 0 继续匹配,但这样很耗时间

瞎搞一下,发现 t [ j ] 前面的都已经和 s [ i ] 前面的匹配好了, 这样如果 j 前面子串的前缀和后缀相同的最大长度都可以不用匹配

e.g. (1) t 串中 abcab的最后一位 t [ 4 ] b 不匹配, 前面的abca都匹配好了,即 s [ 3 ] = t [ 3 ] =a, t [ 3 ] a是后缀,  t [ 0 ] a 是和其相等的前缀,肯定和 s [ 3 ] 相等

这位就可以不用匹配了

直接跳到 t [ 1 ] 去匹配

更具象一点

(2)abcaabcabeabcabd

                  i
        abcabd
                  j

此时  s [ i ] 与 t [ j ] 不匹配,后缀 t [ 3 ] t [ 4 ] = ab 与 s [ 7 ] s [ 8 ] = ab 匹配好了, 最大前缀 t [ 0 ] t [ 1 ] = ab 肯定也匹配好了

接下来 j 直接跳到 2 与 s [ 9 ] 匹配就可以了

我们用一个数组nxt表示 t 串中 位置 i 不匹配时该跳到哪一位

线性求nxt数组,根据最大前后缀匹配求(找个串模拟一下更好理解

void getnxt(string s){    ll n=s.size();    ll j=0, k=-1; //j比k大一位    nxt[0]=-1; //初始化为-1, 方便判断    while(j

nxt数组优化

在e.g.(1)中, 

abcaabcabeabcabd

        i
abcabd
        j=4

t [ 4 ]不匹配, nxt [ 4 ]=1,j  应该跳到1去匹配, 但是 t [ 1 ] == t [ 4 ], t [ 4 ]失配, t [ 1 ]肯定也失配

这样就又多耗时间了

咋优化咧

在求 nxt 的时候判断一下就好啦

void getnxt(string s){    ll n=s.size();    ll j=0, k=-1; //j比k大一位   nxt[0]=-1; //初始化为-1, 方便判断   while(j

 

 完整kmp代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;typedef pair
P;typedef long double ld;#define mem(x) memset(x, 0, sizeof(x))#define me(x) memset(x, -1, sizeof(x))#define fo(i,n) for(i=0; i
>s>>t) { getnxt(t); n=s.size(); m=t.size(); k=kmp(s,t); cout<
<

 

转载于:https://www.cnblogs.com/op-z/p/11307464.html

你可能感兴趣的文章
tensorflow从入门到放弃-0
查看>>
解锁scott用户
查看>>
多态的理解
查看>>
AspNet Core 发布到Linux系统和发布IIS 注意项
查看>>
Windows添加.NET Framework 3.0 NetFx3 失败 - 状态为:0x800f0950
查看>>
隐藏显示终端的光标(shell echo,linux c printf)
查看>>
SQL Server 存储过程
查看>>
JSP 标准标签库(JSTL)(JSP Standard Tag Library)
查看>>
导入项目遇到的问题: Some projects cannot be imported because they already exist in the workspace....
查看>>
华为:字符集合
查看>>
用Okhttp框架登录之后的Cookie设置到webView中(转)
查看>>
Java_Activiti5_菜鸟也来学Activiti5工作流_之入门简单例子(一)
查看>>
设计模式(一)工厂模式Factory(创建型)
查看>>
linux中安装软件的集中方法
查看>>
java获取当前路径的几种方法
查看>>
常用的js函数
查看>>
Unity 碰撞检测 OnTriggerEnter 入门
查看>>
利用DFS求联通块个数
查看>>
总结:
查看>>
spring boot 整合redis --sea 方式1
查看>>