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.
循环遍历:回文字符串有2种可能,一种是abba这种形式,一种是aba这种形式;因此分2种情况进行遍历;保存长度最长的即可。
time: O(n*n)
<span style="font-size:14px;">public class Solution {
int max=0;
String res="";
public String longestPalindrome(String s) {
if(s==null)
return s;
int len=s.length();
if(len<=1)
return s;
for(int i=1;i<len;i++){
palinhelp(s,i-1,i,0,len);
palinhelp(s,i-1,i+1,1,len);
}
return res;
}
public void palinhelp(String s,int j,int k,int flag,int len){
int temp=0;
while(j>=0&&k<len&&s.charAt(j)==s.charAt(k)){
temp+=2;
j--;
k++;
}
if(temp+flag>max){
res=s.substring(j+1,k);
max=temp+flag;
}
}
}</span>
动态规划:从后往前求解,flag[i][j]表明i,i+1,...,j-1,j是回文串,且i+1,...,j-1也是回文串。利用的就是这一性质.
实际执行时间比前者要大。
time: O(n*n)
space: O(n*n)
public String longestPalindrome(String s) {
if(s==null)
return s;
int len=s.length();
if(len<=1)
return s;
String res="";
boolean[][] flag=new boolean[len][len];
int index;
int max=1;
for(int i=len-2;i>=0;i--){
index=i;
for(int j=i+1;j<len;j++){
if((j-i)<3&&s.charAt(i)==s.charAt(j)){
flag[i][j]=true;
index=j;
}
else if(s.charAt(i)==s.charAt(j)&&flag[i+1][j-1])
{
flag[i][j]=true;
index=j;
}
}
if((index-i+1)>max){
max=index-i+1;
res=s.substring(i,index+1);
}
}
return res;
}