动态规划-最长的回文序列

这篇具有很好参考价值的文章主要介绍了动态规划-最长的回文序列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


该题是lintcode上 667 · 最长的回文序列,该题的解题思路亦是参考了九章侯老师的解题思路给出。

1 描述

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

2 样例

2.1 样例1

输入: “bbbab”
输出: 4
解释:
一个可能的最长回文序列为 “bbbb”

2.2 样例2

输入: “bbbbb”
输出: 5

3 解题思路以及实现方法

3.1 解题思路

3.1.1 确定状态

最优策略产生最长的回文子串T,其长度为M;

  • 情况1:回文串长度为1,既只包含一个字母
  • 情况2:回文串长度大于1,则T[0] == T[M - 1]
    对于情况2,剩余部分T[1…M - 2]仍然是一个回文串

子问题:
要求s[i…j]的最长回文子串
如果s[i] == s[j],需要知道s[i + 1, j + 1]的最长回文子串,否则,答案是s[i + 1 … j]的最长回文子串或s[i, …, j - 1]的最长回文子串
状态:设f[i][j]表示为s[i … j]的最长回文子串的长度

3.1.2 转移方程

动态规划-最长的回文序列

3.1.3 初始条件和边界情况

状态:设f[i][j]表示为s[i … j]的最长回文子串的长度
f[i][j] = max{f[i+1][j], f[i][j-1], f[i+1][j-1] + 2|S[i]=S[j]}

初始条件:

  • f[0][0] = f[1][1] = … = f[N-1][N-1] = 1
    • 一个字母,既长度为1的回文串
  • 如果s[i] == s[i + 1],f[i][i + 1] = 2
  • 如果s[i] != s[i + 1],f[i][i + 1] = 1

3.1.4 计算顺序

设f[i][j]表示为s[i … j]的最长回文子串的长度
f[i][j] = max{f[i+1][j], f[i][j-1], f[i+1][j-1] + 2|S[i]=S[j]}
区间动态规划:按照长度j - i 从小到大一次去计算。文章来源地址https://www.toymoban.com/news/detail-492672.html

3.2 题解

3.2.1 C++实现

class Solution {
public:
    /**
     * @param s: the maximum length of s is 1000
     * @return: the longest palindromic subsequence's length
     */
    int longestPalindromeSubseq(string &s) {
        // write your code here
        int n = s.size();

        if (n <= 1) {
            return n;
        }

        vector<vector<int>> f(n, vector<int>(n, 1));

        for (int i = 0; i < n - 1; i++) {
            f[i][i + 1] = (s[i] == s[i + 1]) ? 2 : 1;
        }

        for (int len = 3; len <= n; len++) {
            for (int i = 0; i <= n - len; i++) {
                int j = i + len - 1;
                f[i][j] = max(f[i + 1][j], f[i][j - 1]);
                if (s[i] == s[j]) {
                    f[i][j] = max(f[i][j], f[i + 1][j - 1] + 2);
                }
            }
        }

        return f[0][n - 1];
    }
};

3.2.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) {
        // write your code here
        char[] str = s.toCharArray();
        int n = str.length;
        if (n <= 1) {
            return n;
        }

        int[][] f = new int[n][n];

        for (int i = 0; i < n; i++) {
            f[i][i] = 1;
        }

        for (int i = 0; i < n - 1; i++) {
            f[i][i + 1] = (str[i] == str[i + 1]) ? 2 : 1;
        }

        for (int len = 3; len <= n; len++) {
            for (int i = 0; i <= n - len; i++) {
                int j = i + len - 1;
                f[i][j] = Math.max(f[i + 1][j], f[i][j - 1]);
                if (str[i] == str[j]) {
                    f[i][j] = Math.max(f[i][j], f[i + 1][j - 1] + 2);
                }
            }
        }

        return f[0][n - 1];
    }
}

到了这里,关于动态规划-最长的回文序列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 最长回文子序列问题的原理与实现:动态规划的又一经典应用

    回文是指一个正着读和反着读都一样的字符串,比如 “aba” , “racecar” , “madam” 等。回文有许多有趣的性质和应用,比如在密码学,生物信息学,数据压缩等领域都有涉及。 那么,给定一个字符串,如何找出它的最长回文子序列呢?最长回文子序列是指从原字符串中删

    2023年04月13日
    浏览(49)
  • 动态规划-最长回文子串

    突然觉得很有必要将学过的内容记录下来,这样后续在需要用到的时候就可以避免从头进行学习,而去看自己之前做过的笔记无疑是效率更高的方法。 而作为计算机专业的学生,纸质笔记无法很好的进行记录,像写代码、画图、画表都是很麻烦的,而且纸质的很容易丢,因此

    2024年04月14日
    浏览(38)
  • 动态规划——最长回文子串

    给你一个字符串 s ,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例 1: 示例 2: 1、动态规划算法 解题思路 (1)考虑 回文串的性质 :若一个子串是回文串并且 长度大于2 ,则将其 首尾两个字母去除 后,该子串仍然是一

    2024年04月08日
    浏览(51)
  • day57|动态规划17-最长回文子串问题

    回文子串:强调连续 回文子序列:不强调连续 暴力思路:三层for循环 双指针思路: 动态规划 dp数组 dp[i][j]: 根据字符串的形式和所解决的问题确定dp数组的形式和含义。 递归公式 (分情况讨论) 2.1 如果 i j 2.2 如果 j-i 1 2.3 如果 j-i1: 此时依赖于dp[i+1][j-1]是不是一个回文子

    2024年02月09日
    浏览(43)
  • 【算法|动态规划No30】leetcode5. 最长回文子串

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成长,共同进步。

    2024年02月08日
    浏览(41)
  • 【算法题】动态规划中级阶段之最长回文子串、括号生成、跳跃游戏

    动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。 动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而

    2024年02月12日
    浏览(45)
  • 最长上升子序列(动态规划)

    所谓的子序列就是在原来序列中找出一部分组成的序列。 与子段不同,不需要连续的某一段,但是要保持原序列的先后顺序 在子序列的基础上, 后一项大于前一项 。                                                                       

    2023年04月24日
    浏览(38)
  • 动态规划--最长公共子序列

    动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题﹐ 即将大规模变成小规模 ,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是﹐适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。 他们之间有关系

    2024年02月04日
    浏览(77)
  • 动态规划——最长公共子序列

    先来讲解以下什么是最长公共子序列。最长公共子序列不是最长相同字符串,有点相似但不一样,来举个简单的例子,有字符串s1=bcdea,s2=abce,最长相同字符串是bc,最大公共部分是2;而最长公共子序列则是bce,最大公共部分是3。可以看出,公共子序列不需要连续相等,有相

    2023年04月19日
    浏览(49)
  • 动态规划---最长连续子序列问题

    最长连续子序列问题算是动态规划问题中的一个小分支,这里单独写一篇文章介绍。至于动态规划基础问题和详细的处理步骤我在我的另一篇文章中详细介绍过。具体解决步骤请移步观看——动态规划基础篇。如果想了解01背包问题和滚动数组相关内容请移步观看——动态规

    2024年02月15日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包