首页 > 其他 > 详细

最长子回文序列

时间:2020-02-18 18:51:04      阅读:43      评论:0      收藏:0      [点我收藏+]

leetcode上的题目

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-subsequence

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

示例 1:
输入:"bbbab"

输出:4

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

示例 2:
输入:"cbbd"

输出: 2

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

 

降维后的动态规划,执行用时 :20 ms, 在所有 Java 提交中击败了88.84%的用户 内存消耗 :40.9 MB, 在所有 Java 提交中击败了96.52%的用户

class Solution {
    public int longestPalindromeSubseq(String s) {
        if (null == s || s.length() == 0) {
            return 0;
        }
        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] = dp[i+1][j] > dp[i][j-1] ? dp[i+1][j] : dp[i][j-1];
        //             // dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]);
        //     }
        // }
        // return dp[0][len-1]; 

        int dp[] = new int[len];
        int temp = 0;
        int pre = 0;
        for (int i=len-1; i>=0; --i) {
            dp[i] = 1;
            pre = 0;
            for (int j=i+1; j<len; ++j) {
                temp = dp[j];
                dp[j] = s.charAt(i) == s.charAt(j) ?  dp[j] = pre + 2 : Math.max(dp[j], dp[j-1]);
                pre = temp;
            }
            
        }
        return dp[len-1];
    }
}

 

最长子回文序列

原文:https://www.cnblogs.com/steve-jiang/p/12327270.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!