「算法」「5. 最长回文子串」

5.最长回文子串

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

示例 1:

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

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


本题的考点为中心扩散算法,即对于字符串,同时做中心扩散为单或复数的处理。这么说起来可能有些复杂,举个栗子。
我们有个字符串,abcba 此时中心为 c,若我们还有个字符串 abccba,那么中心应该为 cc向两侧扩散。这个方法有点类似于寻找数组中的3数相加等于目标数的问题。

话不多说,上代码。

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
  const length = s.length
  let start = 0, end = 0
  if(!s.length || s === undefined) {
      return ''
  }
  for(let i = 0; i < length; i++) {
      let len1 = getMaxMidwordsLength(s, i, i)//判断中心为单数向两边扩散
      let len2 = getMaxMidwordsLength(s, i, i + 1)//判断中心为双数向两边扩散
      let len = Math.max(len1, len2)
      if(len > end - start) {
        start = i - parseInt((len - 1) / 2)
        end = i + parseInt(len / 2)
      }
    }
  return s.substring(start, end + 1)
  function getMaxMidwordsLength (words, start, end) {
    while (start >= 0 && end < words.length && words.charAt(start) === words.charAt(end)) {
      start--
      end++
    }  
    return end - start - 1
  }
}

一个for循环内调用两次while循环。条件输入单数开始和复数中心开始。


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

你可能感兴趣的:(「算法」「5. 最长回文子串」)