问题描述:给定一个字符串s,找到其中最长的回文子序列,并返回该序列的长度,可以假设s的最大长度为1000;
暴力解法:直接两个循环,遍历所有子串,并统计子串的最大长度;
public int maxLengthPalindrome(String s)
{
int max=1;
for(int i=0;i<s.length();i++)
{
for(int j=0;j<i;j++)
{
if(isPalindrome(s,i,j))
{
max=Math.max(j-i+1,max);
}
}
}
return max;
}
private Boolean isPalindrome(String s,int indexStart,indexEnd)
{
if((indexEnd-indexStart)==1)
{
if(s.charAt(indexEnd)==s.charAt(indexStart))
{
return true;
}else
{
return false;
}
}
int start=indexStart;
int end=indexEnd;
Boolean flag=true;
while(indexEnd>indexStart)
{
if(s.charAt(indexEnd)!=s.charAt(indexStart))
{
flag=false;
break;
}
end--;
start++;
}
return max;
}
动态规划求解:暴力求解法时间复杂度为O(n3),使用动态规划可以降低到O(n2),使用dp[i][j]表征是否为回文子串,如果s.charAt(i)==s.charAt(j),dp[i][j]=dp[i-1][j-1];(此处要考虑j-i==1的情景),否则为0
public maxLengthPalindrome(String s)
{
Boolean dp[][]=new Boolean[s.length()][s.length()];
if(s.charAt(0)==s.charAt(1))
{
dp[0][1]==true;
}else
{
dp[0][1]=false;
}
int max=Interger.MIN_VALUE;
for(int i=1;i<s.length();i++)
{
for(int j=i+1;j<length;j++)
{
if(s.charAt(i)==s.charAt(j))
{
if(j-i==1)
{
dp[i][j]=true;
max=Math.max(max,2);
}else
{
dp[i][j]=dp[i-1][j-1];
max=Math.max(max,j-i+1);
}
}
else
{
dp[i][j]=false;
}
}
}
return max;
}