Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
在给定一个字符串S中,找到最长的回文串。
很恶心的一道题,不过应该都能想到枚举,从第一个开始枚举。枚举的字母向两头延伸,如果相同则继续,不同则开始下一个枚举。用一个全局变量来保存最长的字符串。
不过用JAVA的话,还是别用String这个类所提供的函数了,因为很耗时。主要体现在构建和取子串这个地方。所以我把S弄成了一个数组。
还有一点要注意的事,回文串存在奇数和偶数的情况。比如bab,这样枚举到a就能找到。但如果是baab呢?他也是回文串,但用枚举的方法就会出问题。
一个解决办法就是在字符串中加入一个通用的符号,每隔一个字符加一个,这样就能保证是奇数了。比如b#a#b,b#a#a#b。可以用枚举。
一定要在字符的开头和末位加入#,不然有可能找到同样长的子串。a#b#c#c 会找到 #b# 和 c#c
因为题目说要找回文串,所以肯定能找到一个回文串的,也不会找到同样长的。这点不用担心。
思路:
1、把字符串弄成数组,过程中加入#号。
2、然后每个字符枚举,向两边延伸。
3、记录当前最长的回文串,注意不用取子串。用数组下标。
4、找到最长的回文串,去掉#。
public class Solution {
public String longestPalindrome(String s) {
String longest_string = "";
int max = 0;
int max_left = 0;
int max_right = 0;
//是在两个字母之间填一个# 使得整个字符串都为奇数
String s_temp = "";
int n = s.length();
char [] temp = new char[n+n+1];
for(int i=1,j=0;j<n;j++,i+=2){
temp[i]=s.charAt(j);
}
for(int i=0;i<n+n+1;i+=2){
temp[i] = '#';
}
//查看数组
/*
for(int i=0;i<n+n+1;i++)
System.out.println(temp[i]);
*/
n = n+n+1;
for(int i=0;i<n;i++){
//System.out.println("begin"+i);
int left = i;
int right = i;
//从该点延伸
while(left>0&&right<n-1&&temp[left-1]==temp[right+1]){
left--;
right++;
}
//如果该点得到的回文串比上一次长
if(right-left+1>=max){
max = right-left+1;
//记下这个时候的left 和 right即可
max_left = left;
max_right = right;
}
}
/*
System.out.println(max_right);
System.out.println(max_left);
System.out.println(temp[max_right]);
System.out.println(temp[max_left]);
*/
String result = "";
//将left和right段的字符加起来
for(int i=max_left;i<=max_right;i++){
if(temp[i]!='#'){
//System.out.println(temp[i]);
result += temp[i];
}
}
return result;
}
}