Manacher算法------求最长回文子串(Java)
2015-10-25 18:09
399 查看
最长回文子串
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
给定字符串A以及它的长度n,请返回最长回文子串的长度。
测试样例:
public class Main {
public static void main(String[] args) {
Main test = new Main();
System.out.println(test.getLongestPalindrome("cdbdbbdabaaaaabaca",18));
}
public int getLongestPalindrome(String A, int n) {
if(A==null){
return 0;
}
int k=0;
int right=0;
int index=0;
int len=2*n+1;
int max=Integer.MIN_VALUE;
char[] Acopy=new char[len];
char[] a=A.toCharArray();
int [] arr=new int[len];
for(int j=0;j<len;j++){
Acopy[j]=(j&1)==0?'#':a[k++];
}
for(int i=1;i<len-1&&right<len-1;i++){
arr[i]=i<right?Math.min(right-i+1, arr[2*index-i]):1;
while((i+arr[i])<len&&(i-arr[i])>=0&&Acopy[i-arr[i]]==Acopy[i+arr[i]]){
arr[i]++;
}
if(i+arr[i]>right){
right=i+arr[i]-1;
index=i;
}
max=Math.max(arr[i],max);
}
return max-1;
}
}
添加回文串
对于一个字符串,我们想通过添加字符的方式使得新的字符串整体变成回文串,但是只能在原串的结尾添加字符,请返回在结尾添加的最短字符串。
给定原字符串A及它的长度n,请返回添加的字符串。保证原串不是回文串。
测试样例:
public class Main {
public static void main(String[] args) {
Main test = new Main();
System.out.println(test.addToPalindrome("abbbbbaa",8));
}
public String addToPalindrome(String A, int n) {
if(A==null){
return null;
}
int k=0;
int right=0;
int index=0;
int len=2*n+1;
char[] Acopy=new char[len];
char[] a=A.toCharArray();
int [] arr=new int[len];
for(int j=0;j<len;j++){
Acopy[j]=(j&1)==0?'#':a[k++];
}
int i;
for(i=1;i<len-1&&right<len-1;i++){
arr[i]=i<right?Math.min(right-i+1, arr[2*index-i]):1;
while((i+arr[i])<len&&(i-arr[i])>=0&&Acopy[i-arr[i]]==Acopy[i+arr[i]]){
arr[i]++;
}
if(i+arr[i]>right){
right=i+arr[i]-1;
index=i;
}
}
char[] temp=new char[n-arr[i-1]+1];
int start=0,end=n-arr[i-1];
for(int j=0;j<=n-arr[i-1];j++){
temp[j]=a[n-arr[i-1]-j];
}
return String.valueOf(temp);
}
}
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
给定字符串A以及它的长度n,请返回最长回文子串的长度。
测试样例:
"abc1234321ab",12
返回:7
public class Main {
public static void main(String[] args) {
Main test = new Main();
System.out.println(test.getLongestPalindrome("cdbdbbdabaaaaabaca",18));
}
public int getLongestPalindrome(String A, int n) {
if(A==null){
return 0;
}
int k=0;
int right=0;
int index=0;
int len=2*n+1;
int max=Integer.MIN_VALUE;
char[] Acopy=new char[len];
char[] a=A.toCharArray();
int [] arr=new int[len];
for(int j=0;j<len;j++){
Acopy[j]=(j&1)==0?'#':a[k++];
}
for(int i=1;i<len-1&&right<len-1;i++){
arr[i]=i<right?Math.min(right-i+1, arr[2*index-i]):1;
while((i+arr[i])<len&&(i-arr[i])>=0&&Acopy[i-arr[i]]==Acopy[i+arr[i]]){
arr[i]++;
}
if(i+arr[i]>right){
right=i+arr[i]-1;
index=i;
}
max=Math.max(arr[i],max);
}
return max-1;
}
}
添加回文串
对于一个字符串,我们想通过添加字符的方式使得新的字符串整体变成回文串,但是只能在原串的结尾添加字符,请返回在结尾添加的最短字符串。
给定原字符串A及它的长度n,请返回添加的字符串。保证原串不是回文串。
测试样例:
"ab",2
返回:"a"
public class Main {
public static void main(String[] args) {
Main test = new Main();
System.out.println(test.addToPalindrome("abbbbbaa",8));
}
public String addToPalindrome(String A, int n) {
if(A==null){
return null;
}
int k=0;
int right=0;
int index=0;
int len=2*n+1;
char[] Acopy=new char[len];
char[] a=A.toCharArray();
int [] arr=new int[len];
for(int j=0;j<len;j++){
Acopy[j]=(j&1)==0?'#':a[k++];
}
int i;
for(i=1;i<len-1&&right<len-1;i++){
arr[i]=i<right?Math.min(right-i+1, arr[2*index-i]):1;
while((i+arr[i])<len&&(i-arr[i])>=0&&Acopy[i-arr[i]]==Acopy[i+arr[i]]){
arr[i]++;
}
if(i+arr[i]>right){
right=i+arr[i]-1;
index=i;
}
}
char[] temp=new char[n-arr[i-1]+1];
int start=0,end=n-arr[i-1];
for(int j=0;j<=n-arr[i-1];j++){
temp[j]=a[n-arr[i-1]-j];
}
return String.valueOf(temp);
}
}
相关文章推荐
- 实现状态栏全沉浸以及兼容低版本半透明沉浸
- Java反射基础(二)--Fileds对象的使用
- Spring学习笔记(三)
- eclipse中报错:Errors running builder “Integrated External Tool Builder” on project
- JAVA中return的用法
- Java基础学习8(程序流程控制)
- 主工程模块yycgproject三层构建
- Eclipse快捷键 10个最有用的快捷键
- java五分钟O(∩_∩)O哈哈~继承好坑
- Ubuntu安装JDK1.6
- Java程序如何生成Jar、exe及安装文件
- Eclipse项目转移到Android Studio
- java容器---Map集合的体系结构
- Java 中新增的 foreach 的用法
- 医药采购系统的主工程模块创建
- java在eclipse中的快捷键
- Java将一段逗号分割的字符串转换成一个数组
- Eclipse中写Hibernate的hbm.xml文件时不自动提示的问题解决
- Java的集合容器(上)
- Java 链接查询