0
点赞
收藏
分享

微信扫一扫

最长回文子序列

ZGtheGreat 2021-09-21 阅读 85
今日算法
题目描述:
示例 1:
示例 2:
思路分析:

例如字符串s [a,b,c,b,d,a](数组形式方便表示),最长回文子序列长度5,最长回文子序列abcbda,dp[0][5],
则它的上一个回文子序列:
因为s[0] == s[5],则dp[0 + 1][5 - 1] 为bcbd
因为s[1] != s[4] 所以两种可能

  • dp[1 + 1][4]跳过左边字符为cbd
  • dp[1][4-1]跳过右边字符为bcb.

可以看到bcb回文序列为2,cbd为1(单个字符回文长度为1),因此应该选择dp[1][3]也就是bcb)
因为s[1] == s[3],则dp[1+1][3-1]为c就结束了。

将整个过程倒过来,从回文长度为1的字符开始,即可求解。

代码实现:
class Solution {
    public int longestPalindromeSubseq(String s) {
        int len = s.length();
        int[][] dp = new int[len][len];
        for (int i = 0; i < len; i++) {
            dp[i][i] = 1;
        }
        for (int i = len - 2; i >= 0; i--) {
            char left = s.charAt(i);
            for (int j = i + 1; j < len; j++) {
                char right = s.charAt(j);
                if (left == right) {
                    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];
    }
}
举报

相关推荐

0 条评论