每天一道leetcode:516. 最长回文子序列(动态规划&中等)

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

今日份题目:

给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。

子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

示例1

输入:s = "bbbab"
输出:4
解释:一个可能的最长回文子序列为 "bbbb" 。

示例2

输入:s = "cbbd"
输出:2
解释:一个可能的最长回文子序列为 "bb" 。

提示

  • 1 <= s.length <= 1000

  • s 仅由小写英文字母组成

题目思路

动态规划,使用二维dp数组记录[i,j]间的最大回文子序列长度。

开始的时候,我尝试使用reverse ( s.begin ( ) , s.end ( ) )翻转字符串判断连续相同位置的最大长度,最后发现与这道题不同,这道题目允许跨某些字母满足回文,所以放弃原来的想法,不过翻转后再动态规划或许也可以,欢迎感兴趣的朋友试一下,评论区讨论哦!

接下来继续讲这道题目的思路。

因为需要枚举区间内的最大长度,如果从前往后遍历,开始的区间跨度太大,可以理解为第一次判断就得出最后返回的结果,肯定是不对的,所以是从最后位置开始遍历i,j就是i+1到最后。然后,回文要满足两头的字母一样,所以对遍历出的每组i和j判断字符是否相同,相同的话,就在原长度也就是i+1到j-1范围内的最大长度加上这两个点的长度2;如果不同,当前点就更新为区间内最大长度。最后返回0到长度-1范围内的最大长度即可。

接下来是比较关键和大家比较关心的状态转移方程:

if(i、j处的字符相同)
{
	dp[i][j]=dp[i+1][j-1]+2;//在原来长度的基础上加上这两个字符的长度
} 
else 两头的字符不同
{
	dp[i][j]=max(dp[i+1][j],dp[i][j-1]);//不需要加上这两头的字符,根据相邻范围的值更新
}

代码

class Solution 
{
public:
    int longestPalindromeSubseq(string s) 
    {
        int n=s.size();
        int dp[2000][2000]={0};//表示[i,j]范围内的最长回文子序列的长度
        for(int i=n-1;i>=0;i--) 
        {
            dp[i][i]=1;//单独一个字符,自己就是最长回文子序列
            char c1=s[i];
            for(int j=i+1;j<n;j++) 
            {
                char c2=s[j];
                if(c1==c2) //两头的字符相同
                {
                    dp[i][j]=dp[i+1][j-1]+2;//在原来长度的基础上加上这两个字符的长度
                } 
                else //两头的字符不同
                {
                    dp[i][j]=max(dp[i+1][j],dp[i][j-1]);//不需要加上这两头的字符
                }
            }
        }
        return dp[0][n-1];//找到[0,n-1]的整个字符串中的最长回文子序列长度
    }
};

提交结果

每天一道leetcode:516. 最长回文子序列(动态规划&中等),动态规划,leetcode,动态规划,算法,职场和发展,c++,数据结构

 欢迎大家在评论区讨论,如有不懂的代码部分,欢迎在评论区留言!文章来源地址https://www.toymoban.com/news/detail-641248.html

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

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

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

相关文章

  • leetcode 516. 最长回文子序列(JAVA)题解

    题目链接 https://leetcode.cn/problems/longest-palindromic-subsequence/description/?utm_source=LCUSutm_medium=ip_redirectutm_campaign=transfer2china 目录 题目描述: 暴力递归: 动态规划: 给你一个字符串  s  ,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况

    2024年02月13日
    浏览(43)
  • 647.回文子串 516.最长回文子序列

    力扣题目链接(opens new window) 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。 示例 1: 输入:“abc” 输出:3 解释:三个回文子串: “a”, “b”, “c” 示例 2: 输入

    2024年01月19日
    浏览(44)
  • Day 57|647. 回文子串| 516.最长回文子序列

    ● 647. 回文子串 ● 516.最长回文子序列 ● 动态规划总结篇 难

    2024年02月16日
    浏览(47)
  • 算法刷题|647.回文子串、516.最长回文子序列

    题目:给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。 d

    2024年02月17日
    浏览(50)
  • 动态规划-最长的回文序列

    该题是lintcode上 667 · 最长的回文序列,该题的解题思路亦是参考了九章侯老师的解题思路给出。 给一字符串 s, 找出在 s 中的最长回文子序列的长度. 你可以假设 s 的最大长度为 1000. 输入: “bbbab” 输出: 4 解释: 一个可能的最长回文序列为 “bbbb” 输入: “bbbbb” 输出:

    2024年02月09日
    浏览(47)
  • 代码随想录 Day - 59|#647 回文字串|#516 最长回文子序列

    ● 647. 回文字串 ● 516. 最长回文子序列 给你一个字符串 s ,请你统计并返回这个字符串中回文子串的数目。 回文字符串是正着读和倒过来读一样的字符串。 子字符串是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成

    2024年02月07日
    浏览(42)
  • 动态规划学习——最长回文子序列,让字符串变成回文串的最小插入次数

    1.题目 给你一个字符串  s  ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。 示例 1: 示例 2: 提示: 1 = s.length = 1000 s  仅由小写英文字母组成 2.题目接口  3.解题思路

    2024年02月04日
    浏览(54)
  • 最长回文子序列问题的原理与实现:动态规划的又一经典应用

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

    2023年04月13日
    浏览(49)
  • 【算法|动态规划No30】leetcode5. 最长回文子串

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

    2024年02月08日
    浏览(41)
  • 【LeetCode动态规划#14】子序列系列题(最长递增子序列、最长连续递增序列、最长重复子数组、最长公共子序列)

    力扣题目链接(opens new window) 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1: 输入:nums = [10,9,2,5,3,7,101,18] 输出

    2024年02月01日
    浏览(56)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包