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"
  }
}
相关推荐
springfe010111 分钟前
构建大顶堆
前端·算法
天真小巫38 分钟前
2025.6.8
职场和发展
凌辰揽月1 小时前
Web后端基础(基础知识)
java·开发语言·前端·数据库·学习·算法
lifallen1 小时前
深入浅出 Arrays.sort(DualPivotQuicksort):如何结合快排、归并、堆排序和插入排序
java·开发语言·数据结构·算法·排序算法
jingfeng5141 小时前
数据结构排序
数据结构·算法·排序算法
能工智人小辰1 小时前
Codeforces Round 509 (Div. 2) C. Coffee Break
c语言·c++·算法
kingmax542120081 小时前
CCF GESP202503 Grade4-B4263 [GESP202503 四级] 荒地开垦
数据结构·算法
岁忧1 小时前
LeetCode 高频 SQL 50 题(基础版)之 【高级字符串函数 / 正则表达式 / 子句】· 上
sql·算法·leetcode
eachin_z2 小时前
力扣刷题(第四十九天)
算法·leetcode·职场和发展
闻缺陷则喜何志丹2 小时前
【强连通分量 缩点 拓扑排序】P3387 【模板】缩点|普及+
c++·算法·拓扑排序·洛谷·强连通分量·缩点