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"
  }
}
相关推荐
zander25827 分钟前
34. 在排序数组中查找元素的第一个和最后一个位置:用两个边界定位区间
数据结构·算法·leetcode
郑州光合科技余经理5 小时前
代驾系统架构拆解:订单链路、权限组织与私有化源码交付
开发语言·后端·算法·架构·系统架构·uni-app·php
To_OC8 小时前
LC 35 搜索插入位置:二分查找谁都会,边界条件谁写谁懵
javascript·算法·leetcode
天才测试猿8 小时前
2026软件测试面试八股文(含答案+文档)
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
码哥DFS8 小时前
二叉树的直径
开发语言·javascript·算法
营养充电站11 小时前
KMP全栈开发:从Android到AI Agent的技术演进与实践
人工智能·算法·docker·jupyter
技术小黑11 小时前
RNN算法实战系列05 | 天气预测
人工智能·rnn·算法
Ivanqhz14 小时前
php8 use-def链
算法·php
spter。14 小时前
AI 面试相同请求为什么会重复调用,如何解决
人工智能·面试·职场和发展