给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。

示例 1:
输入:

"bbbab"
输出:

4
一个可能的最长回文子序列为 "bbbb"。

示例 2:
输入:

"cbbd"
输出:

2
一个可能的最长回文子序列为 "bb"。

思路:一道经典动态规划题,定义dp[i][j]:表示字符串s从前往后到第i个字符匹配到字符串s从后往前第j个字符的回文序列最大值。

class Solution {
    public int longestPalindromeSubseq(String s) {
        
    	int n=s.length();
    	int[][] dp=new int[n+1][n+1];
    	StringBuilder str=new StringBuilder();
    	for(int i=n-1;i>=0;i--) str.append(s.charAt(i));
    	String s1=str.toString();
    	
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++) {
    			if(s.charAt(i-1)==s1.charAt(j-1))
    				dp[i][j]=dp[i-1][j-1]+1;
    			else 
    				dp[i][j]=Math.max(dp[i][j-1], dp[i-1][j]);
    		}
    	
    	return dp[n][n];
    }
}