lintcode 667 · 最长的回文序列【中等 递归到动态规划】

题目

https://www.lintcode.com/problem/667/

java 复制代码
给一字符串 s, 找出在 s 中的最长回文子序列的长度. 你可以假设 s 的最大长度为 1000.

样例
样例1

输入: "bbbab"
输出: 4
解释:
一个可能的最长回文序列为 "bbbb"
样例2

输入: "bbbbb"
输出: 5

思路

复制代码
	思路1:运用最长公共子序列的方法来做,假设求字符串s1的最长回文子序列,
	我们先把s1反转得到字符串s2,求的s1和s2的最长公共子序列就是答案
	
	思路2: 看下面的答案

参考代码

java 复制代码
public class Solution {
    /**
     * @param s: the maximum length of s is 1000
     * @return: the longest palindromic subsequence's length
     */
    public int longestPalindromeSubseq(String s) {
           if(s ==null || s.length() ==0) return 0;

        char[] str = s.toCharArray();
        //return f(str,0,str.length-1); //递归,超时
        return f2(str); //动态规划1,可以通过
    }

    public static int f(char[] str,int L,int R){
        if(L==R) return 1;
        if(L== R-1){
            return str[L] == str[R]? 2:1;
        }

        int p1 = f(str,L+1,R-1);
        int p2 = f(str,L,R-1);
        int p3 = f(str,L+1,R);
        int p4 = str[L] != str[R] ? 0:(2+f(str,L+1,R-1));

        int ans = Math.max(Math.max(p1,p2),Math.max(p3,p4));

        return ans;
    }


    public static int f2(char[] str){
        int n = str.length;
        int[][] dp = new int[n][n];
        dp[n-1][n-1]=1;
        for (int i = 0; i <n-1 ; i++) {
            dp[i][i] =1;
            dp[i][i+1] = str[i] == str[i+1]?2:1;
        }

        for (int i = n-3; i >=0 ; i--) {
            for (int j = i+2; j <n ; j++) {
                int p1 = dp[i+1][j-1];
                int p2 = dp[i][j-1];
                int p3 = dp[i+1][j];
                int p4 = str[i]!=str[j]?0:(2+dp[i+1][j-1]);

                dp[i][j] =Math.max(Math.max(p1,p2),Math.max(p3,p4));
            }
        }
        return dp[0][n-1];
    }
}
相关推荐
C++ 老炮儿的技术栈17 分钟前
MFC CPtrArray的用法
开发语言·数据结构·c++·算法·mfc·c
weixin_4462608523 分钟前
CABAL:用于追踪同行评审中合谋投标影响的多智能体仿真框架
人工智能·算法·机器学习
不会就选b24 分钟前
算法日常・每日刷题--<贪心>6
数据结构·算法·leetcode
青山木1 小时前
Hot 100 --- 跳跃游戏 II
java·数据结构·算法·leetcode·贪心算法
Tisfy1 小时前
LeetCode 3870.统计范围内的逗号:模拟 或 一步计算
数学·算法·leetcode·题解·模拟·遍历
明月_清风1 小时前
字符串匹配四大经典算法:BF、RK、BM、KMP 到底有什么区别?
后端·算法
明月_清风2 小时前
多模式字符串匹配:Trie 与 AC 自动机
后端·算法
木井巳2 小时前
【BFS/DFS 解决 FloodFill 算法】衣橱整理
java·算法·leetcode·深度优先·广度优先·宽度优先
热心网友俣先生2 小时前
2026年高教社杯数模国赛A题:五年命题规律与预测
算法·机器学习·数学建模
LuminousCPP3 小时前
数据结构 - 排序(二):快速排序从错误初版到优化版|双指针划分 + 三数取中 + 小区间插入优化
c语言·数据结构·笔记·算法·排序算法