Java实现 LeetCode 516 最长回文子序列

516. 最长回文子序列

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

示例 1:
输入:

“bbbab”
输出:

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

示例 2:
输入:

“cbbd”
输出:

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

PS:
动态规划,
第一个就不多说了,dp【i】【j】就是截取后i位,然后挨着截取后i位的第j位
相等就+2,不相等找【i+1】【j】和【i】【j-1】中最大的
第二个,根据第一个我一直是用的我的上一个,因为我是i越来越小
然后直接用两个数组,一个保存上一个,一个记录现在,
然后替换即可

class Solution {
    //    public int longestPalindromeSubseq(String s) {
    //     if (s == null || s.length() == 0) {
    //         return 0;
    //     }
    //     int n = s.length();
    //     int[][] dp = new int[n][n];
    //     for (int i = n - 1; i >= 0; i--) {
    //         dp[i][i] = 1;
    //         for (int j = i + 1; j < n; 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][n - 1];
    // }

    
    public int longestPalindromeSubseq(String s) {
        char[] chars=s.toCharArray();
        int length=s.length();
        int[] current=new int[length];
        int[] pre =new int[length]; 
        for(int i=length-1;i>=0;i--){
            current[i]=1;
            for(int j=i+1;j<length;j++){
                if(chars[i]==chars[j]){
                    current[j]=pre[j-1]+2;
                }else{
                    current[j]=Math.max(current[j-1],pre[j]);
                }
            }
            int[] tmp=pre;
            pre=current;
            current=tmp;
        }
        return pre[length-1];
    }
    
}
posted @ 2020-03-22 18:07  南墙1  阅读(275)  评论(0编辑  收藏  举报