Skip to content
On this page

5. 最长回文子串

原题链接:LeetCode 5. 最长回文子串

题目描述

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

示例 1:

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

示例 2:

**输入:**s = "cbbd" 输出:"bb"

提示:

- `1 <= s.length <= 1000`

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

难度: Medium


题解代码

javascript
/**
 * @param {string} s
 * @return {string}
 */
// 使用中心扩散
 var longestPalindrome = function(s) {
  if (s.length < 2) return s
  let maxLen = 1
  let start = 0
  for (let i = 0; i < s.length - 1; i++) {
    const oddLen = expandAroundCenter(s, i, i) // 奇数回文串中心
    const evenLen = expandAroundCenter(s, i, i + 1)  // 偶数回文串中心
    const curMaxLen = Math.max(oddLen, evenLen)
    if (curMaxLen > maxLen) {
      maxLen = curMaxLen
      start = i - Math.floor((maxLen - 1) / 2)
    }
  }
  return s.substr(start, maxLen)
};

function expandAroundCenter (s, left, right) {
  while (left >= 0 && right < s.length) {
    if (s[left] === s[right]) {
      left--
      right++
    } else {
      break
    }
  }
  return right - left - 1
}

// 使用动态规划
var longestPalindrome = function (s) {
  if (s.length < 2) return s
  let maxLen = 1
  let start = 0
  const len = s.length
  const dp = Array(len).fill(0).map(() => Array(len).fill(false))
  for (let i = 0; i < len; i++) {
    dp[i][i] = true
  }

  for (let j = 1; j < len; j++) {
    for (let i = 0; i < j; i++) {
      if (s[i] !== s[j]) {
        dp[i][j] = false
      } else if (j - i < 3) { // 中间最多只有一个元素
        dp[i][j] = true
      } else {
        dp[i][j] = dp[i + 1][j - 1]
      }
      if (dp[i][j] && j - i + 1 > maxLen) {
        maxLen = j - i + 1
        start = i
      }
    }
  }
  return s.substr(start, maxLen)
}

技术文档集合