leetcode 5 最长回文子串

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

题目

给你一个字符串 s,找到 s 中最长的回文子串。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例

输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。

解析

这道题和之前的那道回文的很像:647回文子串,求个数,解法还是动态规划,用动规五部曲分析下:
1、确定DP数组及其含义
这道题的定义方法之前遇到过:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。(是一个true还是false的定义,由于题目是求最长回文串,所以这个dp肯定不能用来当最后的结果)

2、确定递推公式
当s[i] != s[j] 时,那什么都不用说了,肯定是false;
当s[i] == s[j] 时,这就得分情况看下(和之前那道题的分情况套路一样):

  • 若i == j,那就意味是是同一个值,如"a",那没问题,是回文;
  • 若j - i = 1,那意味着是挨着的两个,如"aa",这样的也是回文,注意是j-i,j比i大;
  • 其余的情况,就需要看前一时刻的递推公式怎么样,即dp[i+1][j-1](注意是谁加谁减)

3、 初始化
二维布尔型dp数组的话,默认初始化是false,但要注意其实dp[i][i]这种的一定是true,可以在初始化的时候赋值好

4、遍历顺序
字符串类型的动规遍历顺序都一样,从左下角到右上角

func longestPalindrome(s string) string {
    n := len(s)
    maxLen := 0
    leftIndex := 0
    dp := make([][]bool, n+1)
    for i := 0; i <= n; i++ {
        dp[i] = make([]bool, n+1)
        dp[i][i] = true
    } 
    for i := n-1; i >= 0; i-- {
        for j := i; j <= n-1; j++ {
            if s[i] == s[j] {
                if j - i <= 1 || dp[i+1][j-1] == true {
                    dp[i][j] = true
                    if maxLen < j - i {
                        maxLen = j - i
                        leftIndex = i
                    }
                }
            }
        }
    }
    return s[leftIndex: leftIndex + maxLen + 1]
}

另一种方法是中心扩展法(也不太好理解,还是用动态规划吧)文章来源地址https://www.toymoban.com/news/detail-496121.html

func longestPalindrome(s string) string {
    n := len(s)
    start, end := 0, 0
    for i := 0; i < n; i++ {
        left1, right1 := expend(s, i, i, n)
        left2, right2 := expend(s, i, i+1, n)
        if right1 - left1 > end - start{
            start, end = left1, right1
        }
        if right2 - left2 > end - start{
            start, end = left2, right2
        }
    }
    return s[start:end+1]
}

func expend(s string, i, j, n int) (int, int) {
    for i >= 0 && j < n && s[i] == s[j] {
        i-- //中心扩展
        j++
    }
    return i+1, j-1
}

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

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

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

相关文章

  • 算法打卡day49|动态规划篇17| Leetcode 647. 回文子串、516.最长回文子序列

    Leetcode 647. 回文子串 题目链接:647. 回文子串 大佬视频讲解:647. 回文子串视频讲解  个人思路  这道题的dp数组有点难找到关联,以至于递归关系也不好找,所以看题解吧... 解法 动态规划 动规五部曲: 1.确定dp数组(dp table)以及下标的含义 一般在定义dp数组的时候 会根据题

    2024年04月22日
    浏览(50)
  • 【经典算法】LeetCode 5: 最长回文子串(Java/C/Python3实现含注释说明,Medium)

    标签(题目类型):回文串、动态规划 原题:LeetCode 5 思路 Dynamic Programming(DP) 动态规划是一种将问题分解成子问题并分别计算的优化技术。对于回文子串,我们可以使用动态规划来解决。 对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后

    2024年04月14日
    浏览(66)
  • Leetcode日记 9. 回文数 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

    给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如,121 是回文,而 123 不是。 示例 1: 输入:x = 121 输出:true 示例 2: 输入:x = -121 输出:false 解释:从左向右读, 为 -121 。

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

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

    2024年01月19日
    浏览(45)
  • 最长回文子串&最长子串&第K大的数字&atoi

    解题思路:中心扩散法 中心扩散法 其实,我们知道,对于回文子串来说,是对称的。也就是说,从中心开始,往左扩散,往右扩散,一直去比较左右两边,如果一样,就再去往左扩散,往后扩散,直到结束,如果出现不相等的情况,那就说明不是回文子串。我们来举个例子

    2023年04月08日
    浏览(92)
  • 动态规划-最长回文子串

    突然觉得很有必要将学过的内容记录下来,这样后续在需要用到的时候就可以避免从头进行学习,而去看自己之前做过的笔记无疑是效率更高的方法。 而作为计算机专业的学生,纸质笔记无法很好的进行记录,像写代码、画图、画表都是很麻烦的,而且纸质的很容易丢,因此

    2024年04月14日
    浏览(38)
  • 动态规划——最长回文子串

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

    2024年04月08日
    浏览(51)
  • 【算法沉淀】最长回文子串

     🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏 《数据结构与算法:初学者入门指南》📘📘 希望能和大家一起学习!共同进步! 这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://su

    2024年03月12日
    浏览(46)
  • Day 57|647. 回文子串| 516.最长回文子序列

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

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

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

    2024年02月17日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包