求最长公共前缀和后缀—基于KMP的next数组
KMP算法最主要的就是计算next[]算法,但是我们知道next[]求的是当前字符串之前的子字符串的最大前后缀数,但是有的时候我们需要比较字符串中前后缀最大数,比如
LeetCode的shortest Palindrome 就是基于KMP算法求最短子字符串。
public static int[] longestPS(String s) {
int sLen = s.length();
char[] p = s.toCharArray();
//存放最大前缀后缀数
int[] lNext = new int[sLen];
//最大前后缀数(前缀指针)
int k = 0;
//后缀指针
int j = 1;
while(j < sLen) {
if(p[k] == p[j]) {
//相等则将前一次比较的结果加上这次:k+1;然后继续加1比较。
lNext[j] = k + 1;
k++; j++;
} else {
//如果p[k] != p[j]则k是不是在初始位置,是的话,K不变,后缀指针加1;
if(k == 0) {
j++;
} else {
//k不为0,说明指针不在初始位置。根据lNext数组,找到上一个最大前后缀数的位置,继续判断。
k = lNext[k-1];
}
}
}
return lNext;
}
/*
* 举例:字符串 ABDABCE
* 对应的lNext == {0,0,0,1,2,0,0};
*
*/
下面是KMP的next数组代码,用以比较。
public void GetNext(char* p,int next[]) {
int pLen = strlen(p);
next[0] = -1;
int k = -1;
int j = 0;
while (j < pLen - 1) {
if (k == -1 || p[j] == p[k]) {
++k;
++j;
next[j] = k;
} else {
k = next[k];
}
}
}
如果想要更详细的学习KMP算法,建议请移步此篇博客,从头到尾彻底理解KMP,这是我学习中收收获最多的。
求最长公共前缀和后缀—基于KMP的next数组的更多相关文章
- BNUOJ34990--Justice String (exkmp求最长公共前缀)
Justice String Given two strings A and B, your task is to find a substring of A called justice strin ...
- poj 2774 Long Long Message,后缀数组,求最长公共子串 hdu1403
题意:给出两个字符串,求最长公共子串的长度. 题解:首先将两个字符串连在一起,并在中间加一个特殊字符(字串中不存在的)切割,然后两个串的最长公共字串就变成了全部后缀的最长公共前缀.这时就要用到heig ...
- leetcode 14 最长公共前缀
描述: 给个字符串vector,求最长公共前缀. 解决: 直接取第一个字符串作为最长公共前缀,将其每个字符遍历过一次.设最长字符实际为k,共n个元素,则复杂度O(nk) string longestC ...
- leecode刷题(19)-- 最长公共前缀
leecode刷题(19)-- 最长公共前缀 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: [&quo ...
- 【Leetcode】【简单】【14最长公共前缀】【JavaScript】
题目 14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower",& ...
- Java实现 LeetCode 14 最长公共前缀
14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower",&quo ...
- hdoj 2594 Simpsons’ Hidden Talents 【KMP】【求串的最长公共前缀后缀】
Simpsons' Hidden Talents Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java ...
- 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message
Language: Default Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 21 ...
- 扩展KMP--求字符串S的所有后缀和字符串T的最长公共前缀
在解上面这个问题前我们要先解决一个类似的问题:求字符串s的所有后缀和s本身的最长公共前缀: 我们用next[]数组保存这些值: 现在我们假设要求next[ x ],并且next[ i ] 0<i ...
随机推荐
- 将Asp.Net Core和corefx移植到.Net 4.0
引言 因为工作内容的原因需要兼容 XP,而 XP 最多支持到.Net Framework 4.0.因此无法享受到 .Net Core 带来的一堆很好用的库,好在无论 corefx 还是 Asp.Net ...
- spring 的单例模式
singleton---单例模式 单例模式,在spring 中其实是scope(作用范围)参数的缺省设定值每个bean定义只生成一个对象实例,每次getBean请求获得的都是此实例 单例模式分为饿汉模 ...
- Excel Countif函数用法
公式:=COUNTIF(范围,条件) 例1: 统计A1:A11当中,等于数字3的单元格,结果是4个. 例2:还可以进行大于(>),大于等于(>=),小于(<),小于等于(<=) ...
- Angular4.0学习笔记 从入门到实战打造在线竞拍网站学习笔记之二--路由
Angular4.0基础知识见上一篇博客 路由 简介 接下来学习路由的相关知识 本来是不准备写下去的,因为当时看视频学的时候感觉自己掌握的不错 ( 这是一个灰常不好的想法 ) ,过了一段时间才发现An ...
- 小兴趣:用python生成excel格式座位表
脚本分两个文件: 1.生成二维随机列表:GenerateLocaltion.py 2.将列表导入excel文件:CreateExcel.py 先上GenerateLocaltion.py: impor ...
- 1.three.js世界的4大要素
一.三大组件 在Three.js中,要渲染物体到网页中,我们需要3个组建:场景(scene).相机(camera)和渲染器(renderer).有了这三样东西,才能将物体渲染到网页中去. 记住关建语句 ...
- Python 3.X安装配置
0x01 安装Python 目前,Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的. 本教程安装的是python-3.6.1-amd64版本. Python官网:https ...
- mysql flush操作
FLUSH语法 FLUSH [LOCAL | NO_WRITE_TO_BINLOG] flush_option [, flush_option] ... 如果您想要清除MySQL使用的部分内部缓存,您 ...
- Oracle impdp通过network_link不落地方式导入数据
--Oracle impdp通过network_link不落地方式导入数据 -----------------------------------------------------2014/01/1 ...
- Java中常见数据结构List之ArrayList
这里主要包含ArrayList和LinkedList, 然后再添加一个:CopyOnWriteArrayList 关于Java中的集合内容, 感觉都已经被写烂了, 我这里主要是做个复习, 再从扒下源代 ...