day57|动态规划17-最长回文子串问题

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

回文子串:强调连续
回文子序列:不强调连续

647. 回文子串的个数

day57|动态规划17-最长回文子串问题

  • 暴力思路:三层for循环
  • 双指针思路:
  • 动态规划
  • dp数组
  1. dp[i][j]: 根据字符串的形式和所解决的问题确定dp数组的形式和含义。
    day57|动态规划17-最长回文子串问题
  2. 递归公式(分情况讨论)
    2.1 如果 ij
    2.2 如果 j-i
    1
    2.3 如果 j-i>1: 此时依赖于dp[i+1][j-1]是不是一个回文子串,当dp[i+1][j-1]为一个回文子串时,那么外层也就是一个回文子串。外层利用result记录回文子串的个数。
  3. 初始化:默认都不是回文子串
  4. 遍历顺序: 从底往上,从左到右进行遍历(再确定遍历顺序的时候,一定要搞清楚后一个状态与前一个状态的以来依赖关系,依赖关系决定了元素的遍历顺序。并且要控制j应该是大于等于i的。
  5. 输出结果day57|动态规划17-最长回文子串问题
class Solution:
    def countSubstrings(self, s: str) -> int:
    	# dp[i][j]表示字符串i-j之间的字符串是否为回文子串
        s = list(s)
        row,col = len(s),len(s)
        dp = [[False]*col for _ in range(row)]
        result = 0
        for i in range(row-1,-1,-1):
            # j的取值一定是大于或者等于i的所以在第2个循环中需要初始化j的取值为i
            for j in range(i,col):
                if s[i] == s[j]:
                    if j-i<=1: dp[i][j] = True
                    else: dp[i][j] = dp[i+1][j-1]
                    if dp[i][j] : result += 1
        return result    

516.最长回文子序列

元素不连续应该怎么分析呢?

  1. dp[i][j] 表示i-j这个范围内的回文子序列的长度
  2. 递推公式: 如何得到i-j之间的回文子序列的长度,还是先比较s[i]和s[j]是否相同。
    2.1 如果s[i]==s[j] 那么最长回文子序列的长度取决于内部的情况dp[i+1][j-1]+2
    2.2 如果s[i]!=s[j] 那么可以分为两种分别考虑s[i]和s[j]的情况,因为考虑的是最长回文子序列,所以取max即可。
  3. 初始化: dp[i][i]=1,在相同的子串时的状态应该初始化为1
  4. 遍历顺序: 从下向上进行遍历
  5. 打印dp数组day57|动态规划17-最长回文子串问题
class Solution:
    def longestPalindromeSubseq(self, s: str) -> int:
        # dp表示i-j之间的最大回文子串有多少个
        s = list(s)
        row,col = len(s),len(s)
        dp = [[0]*row for _ in range(col)]
        for i in range(row):
            dp[i][i] = 1
        for i in range(row-1,-1,-1):
            for j in range(i+1,col,1):
                if s[i] == s[j]:
                    dp[i][j] = dp[i+1][j-1] + 2
                else:
                    dp[i][j] = max(dp[i-1][j],dp[i][j-1])
        # 最后一个状态的元素是[0][-1]
        return dp[0][-1]

动态规划总结篇

1 背包问题

day57|动态规划17-最长回文子串问题

2 打家劫舍

3 股票问题

day57|动态规划17-最长回文子串问题

4 子序列问题

day57|动态规划17-最长回文子串问题

动态规划

图片来自于代码随想录
day57|动态规划17-最长回文子串问题文章来源地址https://www.toymoban.com/news/detail-491139.html

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

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

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

相关文章

  • 【算法|动态规划No30】leetcode5. 最长回文子串

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

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

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

    2024年02月12日
    浏览(45)
  • 【算法】算法学习七:动态规划 | 背包问题 | 最长公共子串(含源代码)

    背包问题是一种经典的组合优化问题,通常有两个版本:0-1背包问题和无限背包问题。 0-1背包问题是指给定一个背包容量和一组物品,每个物品有自己的重量和价值,要求在不超过背包容量的情况下,选择一些物品放入背包,使得物品的总价值最大化。每个物品只能选择放入

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

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

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

    647. 回文子串 双指针法: 遍历回文中心----一个回文中心----两个回文中心 遍历边界,找出回文中心, 其实还是变相的找回文中心 动态规划: 4. dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false 5. 当s[i]与s[j]不相等,那没

    2024年02月15日
    浏览(44)
  • 最长公共子串(动态规划)

    查找两个字符串a,b中的最长公共子串_牛客题霸_牛客网 1.找a 和 b 的最长公共子串实际上是在a的子串和b的子串中找最长公共子串 ins[i][j]实际上记录的就是 以a的第i个字符和以b的第j个字符结尾的子串中存在的最长公共子串的长度 接下来我们举个例子: a: abcabcde b: abcd ins[1][1]

    2023年04月12日
    浏览(49)
  • 动态规划-最长的回文序列

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

    2024年02月09日
    浏览(47)
  • 力扣第131题 分割回文串 c++ 回溯+简单 动态规划(是否为回文子串)

    131. 分割回文串 中等 相关标签 字符串   动态规划   回溯 给你一个字符串  s ,请你将   s   分割成一些子串,使每个子串都是  回文串  。返回  s  所有可能的分割方案。 回文串  是正着读和反着读都一样的字符串。 示例 1: 示例 2: 提示: 1 = s.length = 16 s  仅由小写

    2024年02月07日
    浏览(46)
  • 每天一道leetcode:516. 最长回文子序列(动态规划&中等)

    给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。 1 = s.length = 1000 s 仅由小写英文字母组成 动态规划 ,使用二维dp数组记录[i,j]间的最大回文子序列长度

    2024年02月13日
    浏览(48)
  • ( 动态规划) 516. 最长回文子序列 ——【Leetcode每日一题】

    难度:中等 给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。 示例 1: 输入:s = “bbbab” 输出:4 解释:一个可能的最长回文子序列为 “bbbb” 。 示例

    2024年02月06日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包