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. Docker入门与应用系列(二)镜像管理

    1.1 什么是镜像 简单说,Docker镜像是一个不包含Linux内核而又精简的Linux操作系统. 1.2 镜像从哪里来 Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容 ...

  2. 解决Pytohn安装第三方库出现read timed out 问题

    输入pip --default-timeout=100 install -U Packages 如pip --default-timeout=100 install -U Pillow

  3. SMO详解

    转自:简书https://www.jianshu.com/p/55458caf0814 SVM通常用对偶问题来求解,这样的好处有两个:1.变量只有N个(N为训练集中的样本个数),原始问题中的变量数量与 ...

  4. 【官方文档】Nginx负载均衡学习笔记(二)负载均衡基本概念介绍

    简介 负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台 ECS 的流量分发控制服务.负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应 ...

  5. python学习笔记2-dict

    常用的dict操作: d={'name':'suki', ', 'sex':'man', 'addr':'nanjing' } #字典取值方便,但是字典是没有顺序的,List有下标 print(d[' ...

  6. Java并发编程原理与实战十三:JDK提供的原子类原理与使用

    原子更新基本类型 原子更新数组 原子更新抽象类型 原子更新字段 原子更新基本类型:   package com.roocon.thread.t8; import java.util.concurren ...

  7. PyQt4 里的表格部件的使用方法: QTableWidget

    PyQt4 里的表格部件的使用方法: QTableWidget QT下QTableWidget使用方法小结 - - 博客频道 - CSDN.NET http://blog.csdn.net/jingz ...

  8. Swiper点击后自动轮播停止情况

    用户操作swiper之后,是否禁止autoplay.默认为true:停止. 如果设置为false,用户操作swiper之后自动切换不会停止,每次都会重新启动autoplay. 操作包括触碰,拖动,点击 ...

  9. github 新创建repositories

    1. 在github上新建repo 2. 找到改repo的地址,用命令git clone https://....,  拉取到本地 3. 打开一个单独的窗口,打开此文件夹 4. 创建自己的python ...

  10. 什么是EOF -- 转

    转载地址:http://www.ruanyifeng.com/blog/2011/11/eof.html 我学习C语言的时候,遇到的一个问题就是EOF. 它是end of file的缩写,表示&quo ...