Given a string s, find the longest palindromic subsequence's length in s. You may assume that the maximum length of s is 1000.
Example 1:
Input:"bbbab"
Output:4
One possible longest palindromic subsequence is "bbbb".
Example 2:
Input:"cbbd"
Output:2
One possible longest palindromic subsequence is "bb".
题意:给出一个长度不超过1000的字符串,求它最长的回文子串。根据示例可知子串可由字符串删除某些字符但不能调换顺序。
思路:利用动态规划思想,循环遍历整个字符串,记录任意两个字符i j之间的回文数:若两个字符相同,则i j间的回文数=i j内(不包括i或者j)最大的回文数+2;若不同,则i j间的回文数=i j内(不包括i或者j)最大的回文数。最后取第一个到最后一个字符的最大回文数。
代码:
class Solution {
public int longestPalindromeSubseq(String s) {
int length = s.length();
int[][] dp= new int[length][length]; //记录任意两个位置之间的最大回文数
for(int i=length-1;i>=0;i--){
dp[i][i] = 1;
for(int j=i+1;j<length;j++){
if(s.charAt(i) == s.charAt(j)){ //若两个字符相等
dp[i][j] = dp[i+1][j-1]+2; //之间的最大回文数加上i和j
}else{ //若字符不等
dp[i][j] = Math.max(dp[i][j-1],dp[i+1][j]); //之间最大的回文数
}
}
}
return dp[0][length-1];
}
}