【算法笔记】扩展kmp算法(exkmp)
讲解参考: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)相关推荐
- 【数据结构和算法笔记】KMP算法介绍
BF暴力算法: 当模式串位i与目标串i比较时两字符不相等,则i的移动方式:i=i-j+1 j的移动方式:j=0 KMP算法简介: ●KMP模式匹配中,当模式串位j与目标串位i比较两字符不相等 i ...
- 浅谈Manacher算法与扩展KMP之间的联系
首先,在谈到Manacher算法之前,我们先来看一个小问题:给定一个字符串S,求该字符串的最长回文子串的长度.对于该问题的求解,网上解法颇多,时间复杂度也不尽相同,这里列述几种常见的解法. 解法一 ...
- 算法笔记之hoorspool算法
算法笔记之hoorspool算法 从右往左进行字符扫描,如果所有匹配成功,则找到了匹配的字串,如果遇到不匹配的时候,就需要将模式右移动,这个时候考虑的是文本与模式最后一个字符对齐的文本字符C 当字符不 ...
- 每日算法练习——模式匹配KMP算法(看毛片算法?)
知识补充: 在计算机科学中,Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置.此算法通过运用对这个词在不匹配时本身就包含足够的信息来 ...
- javaKMP算法(含KMP算法代码)
目录 一:应用场景-字符串匹配问题 二:暴力匹配算法 三:KMP 算法介绍 四:KMP 算法最佳应用-字符串匹配问题 字符串匹配问题: 思路分析图解 五:代码展示 一:应用场景-字符串匹配问题 字符串 ...
- 集训笔记---扩展欧几里德算法(POJ NO.1061 青蛙的约会 有点烦人小跳蛙gcd)
又在搬砖,本来以为这是一个追及问题,后来发现数据好像并不是那么个意思,后来把方程列出来,经过一个去模的操作,我们其实可以找到一点线索,那就是,一个经过变形的二元一次方程,那么在这种情况下,就可以利用扩 ...
- 欧几里德算法与扩展欧几里德算法
欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...
- python实现Trie 树+朴素匹配字符串+RK算法匹配字符串+kmp算法匹配字符串
一.trie树应用: 相应leetcode 常用于搜索提示,如当输入一个网址,可以自动搜索出可能的选择.当没有完全匹配的搜索结果,可以返回前缀最相似的可能. 例如三个单词app, apple, add ...
- kmp算法 php,漫画KMP算法-程序员小灰
// KMP算法主体逻辑.str是主串,pattern是模式串 public static int kmp(String str, String pattern) { //预处理,生成next数组 i ...
- java kmp算法_java实现KMP算法
第一种 暴力移位(效率低,资源浪费) 第二种KMP算法 这是直接盗用老师ppt中的内容,意思大家明白就好了,看代码: public class KMP { public int Index_KMP(S ...
最新文章
- parseInt(),parseFloat(),parse()
- 关于pragma pack的用法(一)
- acwing1304. 佳佳的斐波那契
- 9、mybatis中动态sql的使用
- Jquery 中的CheckBox、 RadioButton、 DropDownList的取值赋值
- SQL left join 、right join 、inner join
- 用sed替换文件中的空格
- 计算机用公式找出第一名,用公式查找Excel工作表中重复数据
- memcached并发CAS模式
- meethigher-文库下载实现自动化
- elastic-Job配置参数详细解释
- 数理统计复习笔记四——区间估计
- java编写一个测试类_java写一个类,并测试它
- 最方便简单的经纬度查询方法
- 泰拉瑞亚服务器怎么修改密码,泰拉瑞亚账号系统功能使用说明 怎么绑定手机号...
- php phpunit_framework_testcase,开始使用PHPUnit
- 快狐未能连接服务器,航海王强者之路好友福袋开启详细介绍_快狐快狐视频app...
- Hark的数据结构与算法练习之归并排序
- thinkpad t480 简介文章
- 关于QA QE QC 测试职位的区别
热门文章
- 定时器_定时器设计的门铃
- linux操作系统基础教程第二版附录答案,Linux操作系统(第2版) 课后习题答案
- 在WPF中自定义控件(1)
- Usage of #pragma
- PHP面试常考内容之面向对象(2)
- 使用SDM配置基于IPsec 加密的GRE隧道
- 国都企信通短信平台发送手机短信的python脚本一例
- PostgreSQL 为什么不要滥用unlogged table hash index
- objective-c中@autoreleasepool的用法
- 配置CACTI监控MySQL数据库状态(2)安装cacti相关软件包