给你一个字符串 s
,找到 s
中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串
动态规划:
class Solution {
public String longestPalindrome(String s) {
if(s.length()==0) return "";
if (s.length()==1) return s;
if (s.length()==2 && s.charAt(0)==s.charAt(1)) return s;
if (s.length()==2 && s.charAt(0)!=s.charAt(1)) return s.substring(0, 1);
boolean[][] flag = new boolean[s.length()+1][s.length()+1];
int mx = 1;
int begin = 0;
for(int i=0;i<s.length();i++){
flag[i][i] = true;
}
for(int j=1;j<s.length();j++){
for(int i=0;i<j;i++){
if (s.charAt(i)!=s.charAt(j)){
flag[i][j] = false;
}else {
if(j-i<3) flag[i][j] =true;
else flag[i][j] = flag[i+1][j-1];
}
if (flag[i][j] && (j-i+1>mx)){
mx = j-i+1;
begin = i;
}
}
}
return s.substring(begin, begin+mx);
}
}
中心扩散法:
class Solution {
public String longestPalindrome(String s) {
if(s.length()==0) return "";
int left = 0;
int right = 0;
int len = 1;
int maxLength = 0;
int start = 0;
for (int i=0;i<s.length();i++){
left = i-1;
right = i+1;
while(left>=0 && s.charAt(left)==s.charAt(i)){
left--;
len++;
}
while(right<s.length() && s.charAt(right)==s.charAt(i)){
right++;
len++;
}
while (left>=0 && right<s.length() && s.charAt(right)==s.charAt(left)){
left--;
right++;
len = len+2;
}
if (len>maxLength){
maxLength = len;
start = left;
}
len = 1;
}
return s.substring(start+1, start+maxLength+1);
}
}