leetcode-5-最长回文串

题目描述

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

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

示例 1:

输入:s = "babad"

输出:"bab"

解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"

输出:"bb"

提示:

1 <= s.length <= 1000

s 仅由数字和英文字母组成

解题思路

要找到最长的回文子串,可以使用动态规划或中心扩展两种方法来解决。下面我将分别介绍这两种方法的思想,并提供使用Scala编写的示例代码。

动态规划方法:

动态规划的思想是利用已知的子问题的解来求解更大规模的问题的解。在这个问题中,我们可以使用一个二维数组 dp,其中 dp(i)(j) 表示从索引 i 到索引 j 的子串是否为回文串。状态转移方程如下:

复制代码
dp(i)(j) = dp(i+1)(j-1) && s(i) == s(j)

在更新 dp 数组的过程中,需要注意边界条件和更新顺序。

中心扩展方法:

中心扩展的思想是以每个字符或两个字符之间的空隙作为回文串的中心,然后向两边扩展来判断是否为回文串。具体步骤如下:

  • 从左到右遍历每个字符,以当前字符为中心向两边扩展,找到以当前字符为中心的最长回文子串。
  • 从左到右遍历每两个相邻字符之间的空隙,以空隙为中心向两边扩展,找到以空隙为中心的最长回文子串。

使用以上两种方法中的任何一种都可以解决这个问题。下面是使用Scala编写的示例代码,演示了动态规划方法的实现:

scala 复制代码
object Solution {
  def longestPalindrome(s: String): String = {
    val n = s.length
    var start = 0
    var maxLength = 1
    val dp = Array.ofDim[Boolean](n, n)

    for (i <- 0 until n)
      dp(i)(i) = true

    for (length <- 2 to n) {
      for (i <- 0 until n - length + 1) {
        val j = i + length - 1
        if (s(i) == s(j)) {
          if (length == 2 || dp(i + 1)(j - 1)) {
            dp(i)(j) = true
            if (length > maxLength) {
              maxLength = length
              start = i
            }
          }
        }
      }
    }

    s.substring(start, start + maxLength)
  }

  def main(args: Array[String]): Unit = {
    val s1 = "babad"
    val s2 = "cbbd"
    println(longestPalindrome(s1))  // Output: "bab"
    println(longestPalindrome(s2))  // Output: "bb"
  }
}
相关推荐
AI小老六1 小时前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术1 小时前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize2 小时前
初识DFS 与 BFS:递归、队列与图遍历
算法
罗西的思考16 小时前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
美团技术团队19 小时前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
To_OC1 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC1 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
BadBadBad__AK2 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
_清歌2 天前
DSpark 深度解读:DeepSeek-V4 如何用「半自回归」把推理速度提升 85%
算法