原文:5. 最长回文子串(LeetCode 解题) - 每天一个JavaScript小知识@Js中文网 · 码农进阶题库

原文地址:https://www.javascriptc.com/interview-tips/zh_cn/leetcode/leetcode-javascript-solution-005/

题目描述:

难度:Middle

相关话题:字符串动态规划

给定一个字符串 s ,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

示例 2:

输入: "cbbd"
输出: "bb"

思路:

对于每一个str[i],都去检查它作为回文的中心的回文长度,

例如 ababcba

索引1b作为中心,那么对应的回文就是aba

索引2作为中心,对应的回文就是bab

索引4作为中心,对应的回文就是abcba

注意的是,回文有2种,ababa,以a为中心,abba,以bb为中心,因此对于每一个索引,都要计算2种形成回文的方式,最后选择最长的。

/**
 * @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
 * @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(str) {
  let max=0
  let maxStr=''
  function check(lo,hi){
    let count=0,s=''
    while(lo>=0 && hi<str.length && str[lo]===str[hi]){
      count+=2
      lo--
      hi++
    }
    s=str.slice(lo+1,hi)
    return [count,s]
  }
  for(let i=0;i<str.length;i++){
    let [c1,s1]=check(i,i),
        [c2,s2]=check(i,i+1)
    c1--
    if(c1>max){
      max=c1
      maxStr=s1
    }
    if(c2>max){
      max=c2
      maxStr=s2
    }
  }
  return maxStr
};
扩展阅读: