很不错的学习链接:https://blog.csdn.net/v_july_v/article/details/7041827

具体思路就看上面的链接就行了,这里只放几个常用的模板

问题描述:

给出字符串a和b,求a中匹配b的所有下标

 const int maxn = 1e6 + ;
int Next[maxn];
void Getnext(char* p)//next数组初始化
{
int plen = strlen(p);
Next[] = -;
int k = -, j = ;
while(j < plen - )//next优化 j < plen也可以,只是多求了next[plen]
{
//p[k]表示前缀 p[j]表示后缀
if(k == - || p[j] == p[k])
{
j++, k++;
if(p[j] != p[k])Next[j] = k;
else Next[j] = Next[k];
}
else k = Next[k];
}
/*while(j < plen - 1)//next数组未优化
{
//p[k]表示前缀 p[j]表示后缀
if(k == -1 || p[j] == p[k])
{
j++, k++;
Next[j] = k;
}
else k = Next[k];
}*/
}
int ans;
void KMP(char* s, char* p)//s为文本串,p为匹配串
{
Getnext(p);ans = 0;//ans为匹配次数
int i = , j = ;
int slen = strlen(s), plen = strlen(p);
while(i < slen)
{
if(j == - || s[i] == p[j])
i++, j++;
else j = Next[j];
if(j == plen)//已经匹配
{
ans++;
//cout<<i - j<<endl;//匹配的下标 从0开始
j = next[j];
i--;//如果所匹配的子串之间不可相交,去掉i--;
}
}
}

KMP另一版本:感觉更快

 int Next[maxn];
void Getnext(char p[], int plen)//next数组初始化
{
Next[] = ;
int k = ;
for(int i = ; i < plen; i++)
{
while(k > && p[k] != p[i])k = Next[k];
if(p[k] == p[i])k++;
Next[i + ] = k;
}
}
int KMP(char s[], char p[], int slen, int plen)//s为文本串,p为匹配串
{
Getnext(p, plen);//如果匹配串p一直不变,可以在函数外面调用一次即可
int k = ;
int ans = ;
for(int i = ; i < slen; i++)
{
while(k > && p[k] != s[i])k = Next[k];
if(p[k] == s[i])k++;
if(k == plen)
{
ans++;
k = Next[k];//匹配的下标i-j 从0开始
}
}
return ans;
}

KMP算法扩展:

https://wenku.baidu.com/view/8e9ebefb0242a8956bece4b3.html?from=search

 //扩展KMP算法
//求字符串S的后缀 与字符串T的最长公共前缀长度
//extand[i]表示S[i...slen] 与 T的最长公共前缀长度
//Next[i]表示T[i...tlen] 与 T的最长公共前缀长度 也就是最长公共前后缀长度 char s[maxn], t[maxn];
int Next[maxn], extand[maxn];
void Getnext(char t[])//预处理出Next数组
{
int tlen = strlen(t), i = ;
Next[] = tlen;//从0开始的后缀(就是T) 和 T的公共前缀就是T本身
while(i < tlen - && t[i] == t[i + ])i++;
Next[] = i;
int a = ;
for(int i = ; i < tlen; i++)
{
int p = a + Next[a] - , L = Next[i - a];//p为当前匹配到的最远位置,a表示从a开始匹配可以匹配到这个最大位置
if(i - + L >= p)//情况2
{
int j = (p - i + ) > ? (p - i + ) : ;
while(i + j < tlen && t[i + j] == t[j])j++;
Next[i] = j;
a = i;
}
else Next[i] = L;//情况1
}
}
void Getextand(char* s, char* t)
{
memset(Next, , sizeof(Next));
Getnext(t);
int slen = strlen(s), tlen = strlen(t);
int Minlen = Min(slen, tlen);
int a = ;
while(a < Minlen && s[a] == t[a])a++;
extand[] = a;
a = ;
for(int i = ; i < slen; i++)
{
int p = a + extand[a] - , L = Next[i - a];
if(i - + L >= p)//情况2
{
int j = (p - i + ) > ? (p - i + ) : ;
while(i + j < slen && j < tlen && s[i + j] == t[j])j++;
extand[i] = j;
a = i;
}
else extand[i] = L;
}
}

KMP算法模板&&扩展的更多相关文章

  1. hdu 1711 KMP算法模板题

    题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串 ...

  2. kmp算法模板及理解

    kmp算法是复杂度为O(n+m)的字符串匹配算法; 首先kmp算法的核心是在模式串中获得next数组,这个数组表示模式串的子串的前缀和后缀相同的最长长度; 这样在匹配的过程中如果指到不匹配的位置,模式 ...

  3. 【Luogu P3375】字符串匹配KMP算法模板

    Luogu P3375 模式串:即题目中的S2所代表的意义 文本串:即题目中的S1所代表的意义 对于字符串匹配,有一种很显然的朴素算法:在S1中枚举起点一位一位匹配,失配之后起点往后移动一位,从头开始 ...

  4. POJ 3461 Oulipo KMP算法(模板)

    题意: 给两组字符串a和b,求a在b中出现的次数 关于KMP: 马拉车算法是处理回文串,而KMP是处理前后缀的相同字符串的最长长度. a | a | b | a | a | f | a | a 数组 ...

  5. Kmp 算法模板 C

    /** * name:KMP * time:2012-11-22 * 字符串快速匹配 */ #include<stdio.h> #include<string.h> typed ...

  6. KMP算法模板

    不懂的话推荐看这篇博客,讲的很清楚 http://blog.csdn.net/v_july_v/article/details/7041827 #include<iostream> #in ...

  7. KMP算法———模板

    做出KMP字符串匹配算法心情也是好好哒,萌萌哒. 感谢黄学长,感谢栋栋! #include<cstdio>#include<string>#include<iostrea ...

  8. kmp算法 模板

    #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #inclu ...

  9. KMP算法模板(pascal)

    洛谷P3375: program rrr(input,output); var i,j,lena,lenb:longint; a,b:ansistring; next:..]of longint; b ...

随机推荐

  1. 9.Symbol

    Symbol Symbol 概述 ES5 的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有 ...

  2. 让图片在div中居中

    详情看:https://www.cnblogs.com/yyh1/p/5999152.html

  3. [PHP] 从PHP 5.6.x 移植到 PHP 7.0.x新特性

    从PHP 5.6.x 移植到 PHP 7.0.x 新特性: 1.标量类型声明 字符串(string), 整数 (int), 浮点数 (float), 布尔值 (bool),callable,array ...

  4. HTTP 错误500.19 - 错误代码 0x80070021

    1.错误描述 HTTP 错误500.19 -Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 详细错误信息 模块 IIS Web Core  通知 Begi ...

  5. PHP 经典算法

    <?  //--------------------  // 基本数据结构算法 //--------------------  //二分查找(数组里查找某个元素)  function bin_s ...

  6. C#语言总结1

    C#C#定义: C#是一门面向对象.面向组件的一门语言,是.NET的一部分. 程序结构: 命名空间 类{ 属性 方法 main函数入口 } 数据类型: C#的数据类型分为:值类型(Value type ...

  7. KDTree(Bzoj2648: SJY摆棋子)

    题面 传送门 KDTree 大概就是一个分割\(k\)维空间的数据结构,二叉树 建立:每层选取一维为关键字,把中间的点拿出来,递归左右,有个\(STL\)函数nth_element可以用一下 维护:维 ...

  8. jsp页面乱码

  9. centos使用ngnix代理https

    自己建web服务器,考虑到安全问题需要用到https. 在此使用nginx的反向代理功能实现https 腾讯云证书安装指引 ssl.conf 配置 // http请求重定向https server { ...

  10. Angular入门教程二

    4 功能介绍 4.1数据绑定 AngularJS的双向数据绑定,意味着你可以在Mode(JS)中改变数据,而这些变动立刻就会自动出现在View上,反之亦然.即:一方面可以做到model变化驱动了DOM ...