您的位置:首页 > 编程语言 > Java开发

Java - PAT - L2-008. 最长对称子串 Manacher算法

2016-05-28 19:53 453 查看


L2-008. 最长对称子串

时间限制

100 ms

内存限制

65536 kB

代码长度限制

8000 B

判题程序

Standard

作者

陈越

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11。

输入格式:

输入在一行中给出长度不超过1000的非空字符串。

输出格式:

在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?

输出样例:
11


import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
System.out.println(getPalindromeLength(s));

}
public static int getPalindromeLength(String str){
StringBuilder newStr = new StringBuilder();
//获取新的字符串
newStr.append("#");
for(int i=0 ;i<str.length() ;i++){
newStr.append(str.charAt(i));
newStr.append("#");
}

int[]rad = new int[newStr.length()];
int right = -1;		//右边界
int id = -1;		//中心坐标
for(int i=0 ;i<newStr.length() ;i++){
int r =1 ;
//确定一个最小半径
if(i<=right){
r = Math.min(rad[id]-i+id, rad[2*id-i]);
}
//寻找更大半径
//三个条件 1:中心-半径>=0 2:中心+半径<字符串长度(中心+半径<=length-1) 3:字符串关于中心对称点相同
//符合条件的话,半径自加
while(i-r>=0&&i+r<newStr.length()&&newStr.charAt(i-r)==newStr.charAt(i+r)){
r++;
}
//更新边界 和 中心坐标
if(i+r-1>right){
right = i+r-1;
id = i;
}
rad[i] = r;
}
int maxLength = 0;
for(int r:rad){
if(r>maxLength){
maxLength = r;
}
}
return maxLength-1 ;
}
}


因为
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: