题目分析:查找一个字符串中中最长回文字符串
/**对每一个字母,都查找最大的回文串的长度,left,right分别表示回文串的起始位置*/
public String longestPalindrome(String s) {
int start = 0, end = 0;
int maxLen = 1;
for (int i = 0; i < s.length(); i++) {
int left = i;
int right = i;
while (left > -1 && right < s.length()
&& s.charAt(left) == s.charAt(right)) {
left--;
right++;
}
if (maxLen < right - left + 1) {
maxLen = right - left + 1;
start = left + 1;
end = right - 1;
}
/**字符串长度为偶数*/
left = i;
right = i + 1;
while (left > -1 && right < s.length()
&& s.charAt(left) == s.charAt(right)) {
left--;
right++;
}
if (maxLen < right - left + 1) {
maxLen = right - left + 1;
start = left + 1;
end = right - 1;
}
}
return s.substring(start, end + 1);
}
/**动态规划的思路,主要是考虑其实规划的时候是从内向外的扩展,主要考虑回文串的长度*/
public String longestPalindrome(String s) {
int start=0;
int end=0;
int max=1;
int len=s.length();
if(len<1) return "";
if(len==1) return s;
char[] a=s.toCharArray();
boolean[][] dp=new boolean[len][len];
/**长度为1和2*/
for(int i=0;imax)
{
max=l;
start=i;
end=j;
}
}
}
}
return s.substring(start, end+1);
}
public String longestPalindrome(String s) {
String str=prepare(s);
int n=str.length();
int cen=0;
int r=0;
int[] p=new int[n];
char[] a=str.toCharArray();
for(int i=1;ir)
{
cen=i;
r=p[i]+i;
}
}
/**找到长度最大的元素*/
int len = 0;
int centerIndex = 0;
for (int i = 1; i < n-1; ++i){
if(p[i] > len){
len = p[i];
centerIndex = i;
}
}
return s.substring((centerIndex-len-1)/2, (centerIndex+len-1)/2);
}
public String prepare(String s)
{
if(s.length()==0) return "^$";
String ret="^";
for(char c:s.toCharArray())
{
ret+="#"+c;
}
ret+="#$";
return ret;
}