最长回文子序列

273 阅读1分钟

要求:

给定一个字符串s,找到其中最长的回文子序列。字串是字符串中连续的一个序列,子序列是字符串中保持相对位置的字符串序列。

示例:

输入:"bbbab"
输出:4
可能的最长回文子序列是"bbbb"
输入:"cbbd"
输出:2
可能的最长回文子序列是"bb"

思路:

动态规划:

  1. dp[s.length()][s.length()]:动态数组,dp[i][j]代表字符串索引i,j之间最长回文子序列的长度;
  2. base case:i,j相等时,长度为1,即dp[i][i]=1
  3. 选择:若i,j相等,i前移,j后移;若i, j不相等,可能是i前移,可能是j后移,选择其中的较大值
  4. 状态转移方程:if (s.charAt(i) == s.charAt(j)) dp[i][j] = dp[i+1][j-1] + 2; else dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1])

代码:

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