代码随想录 Day - 59|#647 回文字串|#516 最长回文子序列

这篇具有很好参考价值的文章主要介绍了代码随想录 Day - 59|#647 回文字串|#516 最长回文子序列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

清单

● 647. 回文字串
● 516. 最长回文子序列

LeetCode #647 回文字串

1. 题目

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

2. 思路

需要判断回文字符串(正着读和倒过来读)采用二维数组
增加一个result 参数用于记录True个数 最后return result 即为答案

  1. dp含义: s[i] (正着读) 和 s[j] (倒着读) 能否形成回文字符串
  2. 递推公式 :
    • s[i] != s[j] —> dp[i][j] = False
    • s[i] == s[j]:
      1. j - i <=1 ----> dp[i][j] = True
      1. j - i > 1 -----> dp[i][j] = dp[ i+1 ][ j-1 ]
  3. 初始化: dp[0][0] = False
  4. 遍历顺序: 因为j为倒着读 因此遍历顺序为从下至上 从左往右(类比双指针)

3. 代码实现

class Solution:
    def countSubstrings(self, s: str) -> int:
        #Initial dp
        dp = [[False] * len(s) for _ in range(len(s))]

        result = 0

        for i in range(len(s)-1, -1, -1):
            for j in range(i, len(s)):
                if s[i] == s[j]:
                    if j - i <= 1:
                        dp[i][j] = True
                        result += 1
                    elif dp[i+1][j-1]:
                        dp[i][j] = True
                        result += 1
        return result

LeetCode #516 最长回文子序列

1. 题目

给你一个字符串 s,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

2. 思路

需要统计回文字符串长度(正着读和倒过来读)采用二维数组文章来源地址https://www.toymoban.com/news/detail-728541.html

  1. dp含义: s[i] (正着读) 和 s[j] (倒着读) 形成的回文字符串长度为dp[i][j]
  2. 递推公式 :
    • s[i] != s[j] —> dp[i][j] = max(dp[i+1][j], dp[i][j-1])
    • s[i] == s[j]: dp[i][j] = dp[i+1][j-1] + 2
  3. 初始化: dp[0][0] = 0, dp[i][i] = 1
  4. 遍历顺序: 因为j为倒着读 因此遍历顺序为从下至上 从左往右(类比双指针)

3. 代码实现

class Solution:
    def longestPalindromeSubseq(self, s: str) -> int:
        #Initial dp
        dp = [[0] * len(s) for _ in range(len(s))]
        for i in range(len(s)):
            dp[i][i] = 1
        for i in range(len(s)-1, -1, -1):
            for j in range(i + 1, len(s)):
                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])

        return dp[0][-1]

到了这里,关于代码随想录 Day - 59|#647 回文字串|#516 最长回文子序列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Day 57|647. 回文子串| 516.最长回文子序列

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

    2024年02月16日
    浏览(34)
  • 代码随想录第二天|977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵

    第二天开始了, 一开始自己写,就只想到了先一个个平方,再排序(甚至打算手写排序循环,后来才发现c++有自带的排序函数sort(a.begin(),a.end()),c++真好,加油努力学习c++。 第二种方法然后看提示用双指针也完全没想出来,只能看文章了,泪 写完发现代码乱七八糟,要改。

    2024年02月13日
    浏览(27)
  • 代码随想录Day50

    昨天因为准备面试所以咕咕了一天。今天继续学习动规算法,尽管背包问题已经结束但其中的各类思想仍需要进一步理解。 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两

    2023年04月14日
    浏览(32)
  • 代码随想录day02

    ● 力扣题目链接 ● 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 思路 ● 暴力排序,时间复杂度O(n + nlogn) ● 使用双指针,时间复杂度O(n) 代码 ● 力扣题目链接 ● 给定一个含有 n 个正整数的数组和一个正整

    2024年02月13日
    浏览(27)
  • 代码随想录day01

    ● 思维不难,主要是考察对代码的掌控能力 ● 内存中的存储方式:存放在连续内存空间上的相同类型数据的集合 ● 数组可以通过下标索引获取到下标对应的数据 ● 数组下标从0开始 ● 因为内存空间地址连续,因此删除或增加元素的时候,难免移动其他元素地址 ● Java中的

    2024年02月13日
    浏览(38)
  • 代码随想录Day62

    今天继续学习单调栈解决相关问题。 nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。 给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。 对于每个 0 = i nums1.length ,找出满足 nums1

    2024年02月01日
    浏览(35)
  • 代码随想录day11

    20. 有效的括号   思路:这里用模拟栈的方法会更好理解,也就是我们每次遇到朝左方向的三种类型的时候,就加入相反方向的右括号到result栈中。由于栈是一个先进后出的方式,所以我们会有一个判断stack当前为不为空,和stack[-1]是不是和当前循环到的括号相同。如果说相同

    2024年02月13日
    浏览(29)
  • 代码随想录day44

    完全背包 其实就是每个物品可以使用无数次,给我们一个容器,装满这个容器的最大价值是多少。 思路: 如果求组合数就是外层for循环遍历物品,内层for遍历背包。 如果求排列数就是外层for遍历背包,内层for循环遍历物品。 完全背包的组合和排序 518. 零钱兑换 II 题目 给你

    2023年04月17日
    浏览(40)
  • 代码随想录Day58

    昨天因为志愿活动和笔试耽误了一整天,今天继续学习动规解决子序列问题。 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,\\\"ace\\\"是\\\"abcde\\\"的一个子序列,

    2023年04月27日
    浏览(35)
  • 代码随想录day6

    一开始想着构建两个hash表,但如果后面字符串长的可能会超时 这里借用数组构建hash表,主要思想是26个字母组成的数组统计出现次数 如果有出现次数为非0,则说明有问题,可以加以利用作为判断条件 这里对乱序的子字符串先排序,排序后的结果是否一致可以作为分组的依

    2024年02月04日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包