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.
开始我直接用了下面的蛮力解法,时间复杂度为O(n^3);结果可想而知,直接超时
public class Solution
{
public String longestPalindrome(String s)
{
int n=s.length();
int maxlength=0;
String ss="";
if(n==1)
{
return s;
}
for(int i=0;i<n-maxlength;i++)
{
for(int j=i;j<n;j++)
{
int l=j-i+1;
if(l<=maxlength)
continue;
if(s.charAt(i)!=s.charAt(j))
continue;
String str=s.substring(i,j+1);
int flag=0;
for(int k=0;k<l/2;k++)
{
if(str.charAt(k)!=str.charAt(l-k-1))
{
flag=1;
break;
}
}
if(flag==0)
{
maxlength=l;
ss=str;
}
}
}
return ss;
}
}
然后,我想到了动态规划,使程序的时间复杂度降为O(N^2),成功AC
public class Solution
{
public String longestPalindrome(String s)
{
if(s == null || s.length()==0)
return "";
if(s.length()==1)
return s;
boolean[][] flag = new boolean[s.length()][s.length()];
String res = "";
int maxLen = 0;
for(int j=1;j<s.length();j++)
{
for(int i=0;i<j;i++)
{
if(s.charAt(i)==s.charAt(j) && (j-i<=2 || flag[i+1][j-1])) //j-i<=2的判断是为了出现flag[2][3]=flag[3][2]这样的情况
{ //比如 aa aba
flag[i][j] = true;
if(maxLen<j-i+1)
{
maxLen=j-i+1;
res = s.substring(i,j+1);
}
}
}
}
return res;
}
}