KMP的子串长n,模式串长m,复杂度o(m+n),朴素做法的复杂度o((n-m+1)*m)

觉得大话数据结果上面这个讲得特别好

改进版本的KMP

leetcode

28. Implement strStr()

class Solution {
public: void getnext(string str,int next[])
{
int i=1;
int j=0;
next[1]=0;
int str0=str.length()-1;
while(i<=str0)
{
if(j==0||str[i]==str[j])
{
++j;
++i;
next[i]=j;
}
else
{
j=next[j];
}
} }
int kmp(string s,string t)
{
int cnt=0;
//int *next=new int[1000002];
int next[1000002];
getnext(t,next);
int i=1;
int j=1;
int s0=s.length()-1,t0=t.length()-1;
int idx=-1;
while(i<=s0&&j<=t0)
{
if(j==0||s[i]==t[j])
{
++i;
++j;
}
else
{
j=next[j];
}
if(j>t0)
{
cnt++;
idx=i-t0-1;
break; }
}
return idx;
} int strStr(string haystack, string needle) {
if(haystack.length()==0&&needle.length()<=haystack.length()||needle.length()==0) return 0;
string tmpt="#",tmps="#";
tmpt+=needle;
tmps+=haystack;
return kmp(tmps, tmpt); }
};
class Solution {
public: void getnext(string str,int next[])
{
int i=1;
int j=0;
next[1]=0;
int str0=str.length()-1;
while(i<=str0)
{
if(j==0||str[i]==str[j])
{
++j;
++i;
if(str[i]!=str[j])
next[i]=j;
else
next[i]=next[j];
}
else
{
j=next[j];
}
} }
int kmp(string s,string t)
{
int cnt=0;
//int *next=new int[1000002];
int next[1000002];
getnext(t,next);
int i=1;
int j=1;
int s0=s.length()-1,t0=t.length()-1;
int idx=-1;
while(i<=s0&&j<=t0)
{
if(j==0||s[i]==t[j])
{
++i;
++j;
}
else
{
j=next[j];
}
if(j>t0)
{
cnt++;
idx=i-t0-1;
break; }
}
return idx;
} int strStr(string haystack, string needle) {
if(haystack.length()==0&&needle.length()<=haystack.length()||needle.length()==0) return 0;
string tmpt="#",tmps="#";
tmpt+=needle;
tmps+=haystack;
return kmp(tmps, tmpt); }
};

  

  

acm专题---KMP模板的更多相关文章

  1. kuangbin专题16B(kmp模板)

    题目链接: https://vjudge.net/contest/70325#problem/B 题意: 输出模式串在主串中出现的次数 思路: kmp模板 在 kmp 函数中匹配成功计数加一, 再令 ...

  2. kuangbin专题16A(kmp模板)

    题目链接: https://vjudge.net/contest/70325#problem/A 题意: 有两个数组 a, b, 输出 b 数组在 a 数组中的第一个匹配位置, 不能匹配则输出 -1. ...

  3. HDU 1711 - Number Sequence - [KMP模板题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Time Limit: 10000/5000 MS (Java/Others) Memory L ...

  4. HDU 1711 Number Sequence(KMP模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1711 这道题就是一个KMP模板. #include<iostream> #include<cs ...

  5. ACM赛前准备——模板(排版篇)

    ACM赛前准备--模板(排版篇) 更新 前言 效果演示 封面 目录页 模板页(不分栏) 模板页(分栏) 结果文件 快速使用 准备工作 安装TexLive (可选)安装minted包 创建模板 文件结构 ...

  6. 剪花布条---hdu2087(kmp模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 kmp模板题: #include <cstdio> #include <cst ...

  7. hdu 1686 KMP模板

    // hdu 1686 KMP模板 // 没啥好说的,KMP裸题,这里是MP模板 #include <cstdio> #include <iostream> #include ...

  8. Oulipo HDU 1686 KMP模板

    题目大意:求模式串在主串中的出现次数. 题目思路:KMP模板题 #include<iostream> #include<algorithm> #include<cstri ...

  9. KMP模板(bin)

    KMP模板 主要是kuangbin的模板,之后加了一点我的习惯和理解. kmpN() 作用:构造next数组 参数:模式串,模式串长度 kmpC() 作用:返回模式串在主串中出现的次数(可重复) 参数 ...

随机推荐

  1. VIM 模板

    Vim实现自动加载模版功能可以有很多的方法,比如利用插件和AutoCmd等.根据文件名自动加载模板的功能利用网上某大牛自己写的插件实现,我针对Java代码进行简单地修改,以实现模板中的Java主类类名 ...

  2. git pull 总要求输入账号和密码解决?

    如果你用git从远程pull拉取代码,每次都要输入密码,那么执行下面命令即可 git config --global credential.helper store 这个命令则是在你的本地生成一个账号 ...

  3. JsonTools

    public class JsonTools { /// <summary> /// Generate Json string from the object /// </summa ...

  4. 解题:洛谷4721 [模板]分治FFT

    题面 这是CDQ入门题,不要被题目名骗了,这核心根本不在不在FFT上啊=.= 因为后面的项的计算依赖于前面的项,不能直接FFT.所以用CDQ的思想,算出前面然后考虑给后面的贡献 #include< ...

  5. loj2541【PKUWC2018】猎人杀

    题解 题目中的选择条件等价于正常选择所有猎人,而如果选到已经出局的猎人就继续选: 这两种选法是一样的因为(设$W=\sum_{i=1}^{n}w_{i}$ , $X$为已经出局的猎人的$w$之和): ...

  6. python之旅:面向对象之继承与派生

    一 初识继承 编写类时,并非总要从空白开始.如果你要编写的类正好是另一个现成类的特殊版本,可使用继承来减少代码冗余,子类会“遗传”父类的属性,从而解决代码重用问题 什么是继承 继承是一种创建新类的方式 ...

  7. mongodb 使用 robo3T 等工具添加用户之后还是 auth failed 的问题

    命令行输入 mongo use 对应的 db(需要授权的数据库),如 use admin 使用命令创建一个数据库,并赋予权限: db.createUser( { user: "xxx&quo ...

  8. Java入门:使用Java API

    什么是Java类库 在编写程序的时候,通常有很多功能是通用的,或者是很基础的,可以用这些功能来组成更发杂的功能代码.比如文件操作,不同程序对文件的操作基本都是一样的,打开文件,关闭文件,读取文件里面的 ...

  9. go语言从零学起(一) -- 文档教程篇

    先记录一下自己学go语言的出发点 作为一个phper,精通一门底层语言一直是努力的目标. 相对于c,c++,go语言不需要过多的关注指针,内存释放,一两行代码就能跑起一个server服务,简直不要太简 ...

  10. Hadoop生态圈-phoenix完全分布式部署以及常用命令介绍

    Hadoop生态圈-phoenix完全分布式部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. phoenix只是一个插件,我们可以用hive给hbase套上一个JDBC壳,但是你 ...