首页 > 编程语言 >代码随想录算法训练营第49天 | 动态规划总结

代码随想录算法训练营第49天 | 动态规划总结

时间:2024-07-28 14:39:35浏览次数:19  
标签:49 训练营 随想录 len range 序列 dp 回文

代码随想录算法训练营第天 |

647.回文子串
https://leetcode.cn/problems/palindromic-substrings/description/
代码随想录
https://programmercarl.com/0647.回文子串.html#思路
516.最长回文子序列
https://leetcode.cn/problems/longest-palindromic-subsequence/
代码随想录
https://programmercarl.com/0516.最长回文子序列.html#思路

647. 回文子串

  • dp[i][j]的定义
    • 布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。
  • 递推公式
    • s[i]!=s[j] 说明两端不同 一定不是 dp[i][j]= Flase
    • s[i]==s[j]:分类讨论情况
      1. i和j相同 同一个字符串一定是
      2. i-j==1 差一个也是回文字符串
      3. i-1>1 如果dp[i+1][j-1]是回文字符串 这个也一定是
  • 初始化:全部为false
  • 遍历顺序
    • 遍历顺序由上面的依赖条件决定;这里dp[i+1][j-1]得到dp[i][j]。所以从左下向右上遍历
点击查看代码
class Solution:
    def countSubstrings(self, s: str) -> int:
        dp = [[False]*len(s) for _ in range(len(s))]
        res = 0
        for i in range(len(s)-1,-1,-1):
            for j in range(i,len(s)):
                if s[i]==s[j]:
                    if abs(i-j)<2:
                        dp[i][j] = True
                        res = res+1
                    else:
                        if dp[i+1][j-1]:
                            dp[i][j] = True
                            res = res+1
        return res

516. 最长回文子序列

  • 回文子序列和回文序列的区别:如果两个序列不一样的话,选取左右两侧的最大值;
  • 即使内部的子序列不是回文序列也可以;只需要在相同时增加长度即可;
点击查看代码
class Solution:
    def longestPalindromeSubseq(self, s: str) -> int:
        dp = [[0]*len(s) for _ in range(len(s))]
        max_length = 0
        for i in range(len(s)-1,-1,-1):
            for j in range(i,len(s)):
                if s[i]==s[j]:
                    if i==j:
                        dp[i][j] = 1
                    else:
                        dp[i][j] = dp[i+1][j-1]+2
                else:
                    dp[i][j] = max(dp[i+1][j],dp[i][j-1])
                if dp[i][j]>max_length:
                    max_length = dp[i][j]
        # print(np.array(dp))
        return max_length

标签:49,训练营,随想录,len,range,序列,dp,回文
From: https://www.cnblogs.com/P201821440041/p/18327304

相关文章

  • 洛谷题单指南-前缀和差分与离散化-P1496 火烧赤壁
    原题链接:https://www.luogu.com.cn/problem/P1496题意解读:给定n个区间[a,b),计算所有区间覆盖的总长度。解题思路:方法1、离散化先思考一种比较直观的思路:既然要计算多个区间覆盖的总长度,可以枚举每一个区间[a,b),通过一个桶数组来标记区间中所有的点f[x]=1,最终统计所有为1的......
  • 2024牛客暑期多校训练营3
    A.BridgingtheGap2题目大意:有n个人要划船过河(只有一艘船),每个人有\(h_i\)的体力,每次划船最少要L人,最多R人,划船要消耗船上所有人1的体力,问存不存在一种方案可以让所有人过河。思路:首先除了最后一次,前面的都需要有L人把船开回来,所以要有L人体力大于三,即可以算出一共需要\(t=\l......
  • 代码随想录二刷——数组
     ......
  • 代码随想录算法训练营day25:回溯04:491.递增子序列;46.全排列
    491.递增子序列力扣题目链接(opensnewwindow)给定一个整型数组,你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。示例:输入:[4,6,7,7]输出:[[4,6],[4,7],[4,6,7],[4,6,7,7],[6,7],[6,7,7],[7,7],[4,7,7]]说明:给定数组的长度不......
  • 代码随想录算法训练营第22天-leetcode-回溯算法part01:
    #回溯算法理论基础能解决的问题:组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集排列问题:N个数按一定规则全排列,有几种排列方式棋盘问题:N皇后,解数独等等第77题.组合力扣题目链接(op......
  • 代码随想录算法训练营第24天:回溯03:93.复原IP地址;78.子集;90.子集II
    93.复原IP地址力扣题目链接(opensnewwindow)给定一个只包含数字的字符串,复原它并返回所有可能的IP地址格式。有效的IP地址正好由四个整数(每个整数位于0到255之间组成,且不能含有前导0),整数之间用'.'分隔。例如:"0.1.2.201"和"192.168.1.1"是有效的IP地址,......
  • 代码随想录算法训练营第九天 | 151.翻转字符串里的单词,卡码网:55.右旋转字符串,28. 实现
    151.翻转字符串里的单词题目链接:力扣题目链接文章讲解:代码随想录 视频讲解:字符串复杂操作拿捏了!|LeetCode:151.翻转字符串里的单词思路这道题目可以说是综合考察了字符串的多种操作。其实这道题和反转字符串这道题目很像,而且用法也是通用的方法一:切片,reverse,以及......
  • 代码随想录算法训练营第十天 | 232.用栈实现队列 , 225. 用队列实现栈 , 20. 有效的括号
    前两道题目之前单独写了文章,此处就不再重复。232.用栈实现队列-CSDN博客225.用队列实现栈-CSDN博客20.有效的括号题目链接:力扣题目链接文章讲解:代码随想录 视频讲解:栈的拿手好戏!|LeetCode:20.有效的括号思路括号匹配是使用栈解决的经典问题。由于栈结构的......
  • 代码随想录 day 37 完全背包 | 零钱兑换 II | 组合总和 Ⅳ | 爬楼梯 (进阶)
    完全背包完全背包解题思路由于我们可以重复放入物体,那么在遍历背包重量时就必须从前往后遍历,因为这样就可以重复放入了,其余的部分和01背包相同知识点完全背包心得学会了如何解决纯完全背白零钱兑换II零钱兑换II解题思路和之前01背包求总数的思路相同,唯一的不同点在......
  • 2024牛客暑期多校训练营2
    GTheSetofSquares思路:对于一个序列内的所有数的乘积可以分解为p1k1p2k2...pnkn,(p为质数)此时只有当k都为偶数时,这个序列数的乘积才为完全平方数当在两个序列当中,所有k为奇数时对应的质数p都相同,说明这两个序列合并可以构成完全平方数那么可以以ki的奇偶来表示某个质数的状态......