讲解参考:https://www.jianshu.com/p/107e47994d49

要点总结:


(1)目的:母串S,len(S)=n,子串T, len(T)=m, 两个字符串存储时下标都从0开始,suffix(i)表示S串中从下标i开始的后缀,扩展kmp算法可以求每个suffix(i)和T的最长公共前缀长度

(2)nxt[i]表示T串的suffix(i)和T串的最长公共前缀长度

(3)Extend[i]表示S串的suffix(i)和T串的最长公共前缀长度

(4)nxt数组和Extend数组的求法相同,在求nxt时,T串既充当S串又充当T串

(5)求nxt[]时要预处理出nxt[0]和nxt[1],求Extend[]时,因为nxt数组已经求出,所以只需预处理出Extend[0]即可

模版:


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1000010; //字符串长度最大值
int nxt[maxn],Extend[maxn];
char s1[maxn],s2[maxn];
//预处理计算nxt数组
void getnxt(char str[])
{int i=0,j,po,len=strlen(str);nxt[0]=len; //初始化nxt[0]while(str[i]==str[i+1] && i+1<len) i++; nxt[1]=i; //计算nxt[1]po=1; //初始化po的位置for(i=2;i<len;i++){if(nxt[i-po]+i < nxt[po]+po) //第一种情况,可以直接得到nxt[i]的值nxt[i]=nxt[i-po];else //第二种情况,要继续匹配才能得到nxt[i]的值{j = nxt[po]+po-i;if(j<0) j=0; //如果i>po+nxt[po],则要从头开始匹配while(i+j<len && str[j]==str[j+i]) j++; nxt[i]=j;po=i; //更新po的位置}}
}//计算Extendend数组
void EXKMP(char s1[],char s2[])
{int i=0,j,po,len=strlen(s1),l2=strlen(s2);getnxt(s2); //计算子串的nxt数组while(s1[i]==s2[i] && i<l2 && i<len) i++; Extend[0]=i;po=0; //初始化po的位置xfor(i=1;i<len;i++){if(nxt[i-po]+i < Extend[po]+po) //第一种情况,直接可以得到Extendend[i]的值Extend[i]=nxt[i-po];else //第二种情况,要继续匹配才能得到Extendend[i]的值{j = Extend[po]+po-i;if(j<0) j=0; //如果i>Extendend[po]+po则要从头开始匹配while(i+j<len && j<l2 && s1[j+i]==s2[j]) j++; Extend[i]=j;po=i; //更新po的位置}}
}
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);scanf("%s", s1);scanf("%s", s2);//s2是子串EXKMP(s1,s2);int len = strlen(s1);for(int i = 0; i < len; i++)printf("suffix(%d):%s  和子串的最长公共前缀长度为:%d\n",i, s1+i, Extend[i]);return 0;
}

测试样例:第二个字符串为子串

aabaaaab
aaabc

输出:

suffix(0):aabaaaab  和子串的最长公共前缀长度为:2
suffix(1):abaaaab  和子串的最长公共前缀长度为:1
suffix(2):baaaab  和子串的最长公共前缀长度为:0
suffix(3):aaaab  和子串的最长公共前缀长度为:3
suffix(4):aaab  和子串的最长公共前缀长度为:4
suffix(5):aab  和子串的最长公共前缀长度为:2
suffix(6):ab  和子串的最长公共前缀长度为:1
suffix(7):b  和子串的最长公共前缀长度为:0

【算法笔记】扩展kmp算法(exkmp)相关推荐

  1. 【数据结构和算法笔记】KMP算法介绍

    BF暴力算法: 当模式串位i与目标串i比较时两字符不相等,则i的移动方式:i=i-j+1 j的移动方式:j=0   KMP算法简介: ●KMP模式匹配中,当模式串位j与目标串位i比较两字符不相等 i  ...

  2. 浅谈Manacher算法与扩展KMP之间的联系

    首先,在谈到Manacher算法之前,我们先来看一个小问题:给定一个字符串S,求该字符串的最长回文子串的长度.对于该问题的求解,网上解法颇多,时间复杂度也不尽相同,这里列述几种常见的解法. 解法一   ...

  3. 算法笔记之hoorspool算法

    算法笔记之hoorspool算法 从右往左进行字符扫描,如果所有匹配成功,则找到了匹配的字串,如果遇到不匹配的时候,就需要将模式右移动,这个时候考虑的是文本与模式最后一个字符对齐的文本字符C 当字符不 ...

  4. 每日算法练习——模式匹配KMP算法(看毛片算法?)

    知识补充: 在计算机科学中,Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置.此算法通过运用对这个词在不匹配时本身就包含足够的信息来 ...

  5. javaKMP算法(含KMP算法代码)

    目录 一:应用场景-字符串匹配问题 二:暴力匹配算法 三:KMP 算法介绍 四:KMP 算法最佳应用-字符串匹配问题 字符串匹配问题: 思路分析图解 五:代码展示 一:应用场景-字符串匹配问题 字符串 ...

  6. 集训笔记---扩展欧几里德算法(POJ NO.1061 青蛙的约会 有点烦人小跳蛙gcd)

    又在搬砖,本来以为这是一个追及问题,后来发现数据好像并不是那么个意思,后来把方程列出来,经过一个去模的操作,我们其实可以找到一点线索,那就是,一个经过变形的二元一次方程,那么在这种情况下,就可以利用扩 ...

  7. 欧几里德算法与扩展欧几里德算法

    欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...

  8. python实现Trie 树+朴素匹配字符串+RK算法匹配字符串+kmp算法匹配字符串

    一.trie树应用: 相应leetcode 常用于搜索提示,如当输入一个网址,可以自动搜索出可能的选择.当没有完全匹配的搜索结果,可以返回前缀最相似的可能. 例如三个单词app, apple, add ...

  9. kmp算法 php,漫画KMP算法-程序员小灰

    // KMP算法主体逻辑.str是主串,pattern是模式串 public static int kmp(String str, String pattern) { //预处理,生成next数组 i ...

  10. java kmp算法_java实现KMP算法

    第一种 暴力移位(效率低,资源浪费) 第二种KMP算法 这是直接盗用老师ppt中的内容,意思大家明白就好了,看代码: public class KMP { public int Index_KMP(S ...

最新文章

  1. parseInt(),parseFloat(),parse()
  2. 关于pragma pack的用法(一)
  3. acwing1304. 佳佳的斐波那契
  4. 9、mybatis中动态sql的使用
  5. Jquery 中的CheckBox、 RadioButton、 DropDownList的取值赋值
  6. SQL left join 、right join 、inner join
  7. 用sed替换文件中的空格
  8. 计算机用公式找出第一名,用公式查找Excel工作表中重复数据
  9. memcached并发CAS模式
  10. meethigher-文库下载实现自动化
  11. elastic-Job配置参数详细解释
  12. 数理统计复习笔记四——区间估计
  13. java编写一个测试类_java写一个类,并测试它
  14. 最方便简单的经纬度查询方法
  15. 泰拉瑞亚服务器怎么修改密码,泰拉瑞亚账号系统功能使用说明 怎么绑定手机号...
  16. php phpunit_framework_testcase,开始使用PHPUnit
  17. 快狐未能连接服务器,航海王强者之路好友福袋开启详细介绍_快狐快狐视频app...
  18. Hark的数据结构与算法练习之归并排序
  19. thinkpad t480 简介文章
  20. 关于QA QE QC 测试职位的区别

热门文章

  1. 定时器_定时器设计的门铃
  2. linux操作系统基础教程第二版附录答案,Linux操作系统(第2版) 课后习题答案
  3. 在WPF中自定义控件(1)
  4. Usage of #pragma
  5. PHP面试常考内容之面向对象(2)
  6. 使用SDM配置基于IPsec 加密的GRE隧道
  7. 国都企信通短信平台发送手机短信的python脚本一例
  8. PostgreSQL 为什么不要滥用unlogged table hash index
  9. objective-c中@autoreleasepool的用法
  10. 配置CACTI监控MySQL数据库状态(2)安装cacti相关软件包