算法刷题|647.回文子串、516.最长回文子序列

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

回文子串

题目:给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。

回文字符串 是正着读和倒过来读一样的字符串。

子字符串 是字符串中的由连续字符组成的一个序列。

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

  • dp[i][j] 表示[i,j]范围内的字符串是否是回文字符串
  • 递推公式:判断s.charAt(i) 和 s.charAt(j)是否相等
    • 相等:如果i==j,说明只有一个字符,肯定是回文,例如a;如果j-1 = i,说明只有两个字符,并且相等,也肯定是回文,例如aa;如果j-1>i,这时候就需要判断i+1到j-1的范围是否是回文了
      算法刷题|647.回文子串、516.最长回文子序列,算法,算法,动态规划,c++
    • 不相等:那肯定就不是了
  • dp数组初始化:默认全是false
  • 遍历顺序:我们的dp[i][j]主要是由于dp[i+1][j-1]推导出来的,所有我们应该先从大到小遍历i,然后从小到大遍历j
    算法刷题|647.回文子串、516.最长回文子序列,算法,算法,动态规划,c++
  • 打印dp数组
class Solution {
    public int countSubstrings(String s) {
        // dp[i][j] 表示[i,j]范围内的字符串是否是回文字符串
        boolean[][] dp = new boolean[s.length()][s.length()];
        // 初始化 dp[i][j] = false;
        // 记录结果
        int res = 0;
        for(int i = s.length()-1;i>=0;i--){
            for(int j = i;j<s.length();j++){// 根据dp定义知道j是大于i的所以这里j至少需要从i开始
                if(s.charAt(i) == s.charAt(j)){
                    if(j-i<=1){
                        dp[i][j] = true;
                        res++;
                    }else{
                        if(dp[i+1][j-1]){
                            dp[i][j] = true;
                            res++;
                        }
                    }
                }
            }
        }
        return res;
    }
}

最长回文子序列

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

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

思路:本题和上一题的最大的区别在于,上一题求的是子字符串(必须连续),本题是子序列(可以不连续)文章来源地址https://www.toymoban.com/news/detail-580383.html

  • dp[i][j]表示[i,j]范围内的字符串中最长回文子序列的最大长度为dp[i][j]
  • 递推公式:s.charAt(i) 和 s.charAt(j)是否相等
    • 相等:dp[i][j] = dp[i+1][j-1] + 2;因为是左右两个字符,所有加2
    • 不相等:dp[i][j] = Math.max(dp[i+1][j],dp[i][j-1]);
      • 保留j位置字符:dp[i+1][j]
      • 保留i位置字符:dp[i][j-1]
        算法刷题|647.回文子串、516.最长回文子序列,算法,算法,动态规划,c++
  • dp初始化: dp[i][i] = 1,因为当i=j的时候就是只有一个字符,一个字符也是回文子序列,长度为1
  • 遍历顺序:本题和上题一样
  • 打印dp
class Solution {
    public int longestPalindromeSubseq(String s) {
        // dp[i][j]表示[i,j]范围内的字符串中最长回文子序列的最大长度为dp[i][j]
        int[][] dp = new int[s.length()][s.length()];
        // 初始化 dp[i][i] = 1
        for(int i = 0;i<s.length();i++){
            dp[i][i] = 1;
        }
        for(int i = s.length()-1;i>=0;i--){
            // 为什么j从i+1开始,因为j=i这种情况我们已经在初始化的时候处理过了
            for(int j = i+1;j<s.length();j++){
                if(s.charAt(i) == s.charAt(j)){
                    dp[i][j] = dp[i+1][j-1] + 2;
                }else{
                    // dp[i+1][j] 保留j位置的字符
                    // dp[i][j-1] 保留i位置的字符
                    dp[i][j] = Math.max(dp[i+1][j],dp[i][j-1]);
                }
            }
        }
        return dp[0][s.length()-1];
    }
}

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

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

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

相关文章

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

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

    2024年02月07日
    浏览(42)
  • 每天一道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)
  • leetcode 516. 最长回文子序列(JAVA)题解

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

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

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

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

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

    2024年02月12日
    浏览(45)
  • 【LeetCode刷题】最长回文子串

    📝个人主页:爱吃炫迈 💌系列专栏:数据结构与算法 🧑‍💻座右铭:道阻且长,行则将至💗 题目:最长回文子串 思路一:暴力 枚举每一个子串,找回文串,然后通过比较,找出最长的回文串。 会超时 学习更多的JavaScript字符串方法,例如上面代码中用到的 split() , joi

    2023年04月23日
    浏览(64)
  • 力扣刷题笔记-05 最长回文子串

    半山腰有点拥挤,你要去山顶看看。 什么是回文 从左边出发,字符的顺序和从右边出发是一样的,比如aba,abba。那么基于这个理论,我们就可以想到解决方案: 找一个中心点,向两边出发,左右两边各移动一位,如果相同就证明是回文子串,不相同就停止,找下一个中心点

    2024年02月08日
    浏览(46)
  • 力扣题库刷题笔记5--最长回文子串

    1、题目如下: 2、个人Python代码实现:         首先想到的是通过类似冒泡排序的方式进行切片,然后判断切片的子字符串是否为回文字符串,然后记录出最长的回文字符串,代码如下:         可以看到,通过切片的方式,在字符串长度只有1的时候,会报错。当然,这里

    2024年02月09日
    浏览(56)
  • 动态规划——最长回文子串

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

    2024年04月08日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包