博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Manacher算法
阅读量:3962 次
发布时间:2019-05-24

本文共 1752 字,大约阅读时间需要 5 分钟。

Manacher算法

一种求回文子串的方法,时间复杂度与空间复杂度为o(N)

import org.junit.Test;public class Math {
@Test public void Test() {
System.out.println(Manacher("s")); System.out.println("123".substring(0,2)); } //马拉车算法的实现时间复杂度o(N),空间复杂度o(N) //算法步骤:①将数组添加新的字符'#'(其他也可,但是必须是没有在字符串中出现过的),这样做就不用讨论奇数与偶数 //②遍历数组寻找最长字符子串,在这个过程中用i表示遍历到的索引值,创建一个新的数组p[]; //p[i]表示(针对新数组)从i开始(不包括i)往后面延伸到的最后一个字符的字符个数;还需要center与maxRight //两个量,maxRight是当前的子串中可以达到的最右边的索引,center是maxRight对应回文子串的 //中心,两者一一对应, // 那么当i>=maxRight时,这时应该一一的向两端扩散 // 如果i
p[i]=p[mirror] //②p[mirror]=maxRight-i ---->p[i]=p[mirror]=maxRight-i然后继续扩散 //③p[mirror]>maxRight-i ---->p[i]=maxRight-i //综上p[i] = min(p[mirror],maxRight-i) public String Manacher(String s)// {
if(s.length()==0) return s; int m,n; int maxLength=1,index=0; //初始化应该为center = 0,maxRight = 0 int center=0,maxRight=0; int mirror; int []p = new int[s.length()*2+1]; char[] c = Factory(s); for(int i=1;i
=maxRight) {
p[i] = getPI(c,i); } else {
mirror = 2*center-i; p[i] = java.lang.Math.min(maxRight-i,p[mirror]); } //还需要继续扩张 m=i+p[i]+1; n=i-p[i]-1; while(m
=0&&c[m]==c[n]) {
m++; n--; } if(n<0) p[i] = i; else p[i]= m-i-1; if(i+p[i]>maxRight) {
maxRight = i+p[i]; center = i; } System.out.println(p[i]); if(maxLength
=0&&n

转载地址:http://eslzi.baihongyu.com/

你可能感兴趣的文章
chromium 使用
查看>>
linux 检测虚拟机类型
查看>>
go - 运行时:内存不足
查看>>
top 使用
查看>>
Linux Netlink通信机制详解
查看>>
rsync 远程同步
查看>>
nano使用
查看>>
c函数
查看>>
linux 链接
查看>>
centos6.x 添加开机启动服务
查看>>
zfs 简单使用
查看>>
linux EXT4格式分区扩容
查看>>
实现 du 命令
查看>>
git revert reset 使用
查看>>
一些比较好的golang安全项目
查看>>
HTTP状态码
查看>>
go语言
查看>>
mysql mariaDB 以及存储引擎
查看>>
游戏行业了解介绍
查看>>
linux at 命令使用
查看>>