5 Longest Palindromic Substring

北战南征 提交于 2020-02-22 17:17:02

题目

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

Example 1:

1234567
Input: "babad"Output: "bab"Note: "aba" is also a valid answer.Example 2:Input: "cbbd"Output: "bb"

解题思路

从左向右依次遍历字符串.
以当前字符(假设回文数为基数长度)或当前字符和下一个字符(假设回文数为偶数长度)为回文数中心, 向左右两侧搜索.

时间复杂度 O(n2)O(n^2)

代码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
const longestPalindrome = function(s) {  const len = s.length;    if (len <= 1) {    return s;  }  let maxPalStrLeft = 0,    maxPalStrRight = 0;  const expandAroundCenter = (left, right) => {    // 当两字符相同且不超出数组长度时, 继续判断下一对字母是否相同      // 直到超出数组长度/左右的字母不同时,跳出循环      while (left >= 0 && right < len && s[left] === s[right]) {      left--;      rig 大专栏  5 Longest Palindromic Substringht++;    }    // 还原回文的左右字符位置    // 在大多数情况下, while 至少被执行了1次    // 唯一的例外是expandAroundCenter(i, i + 1) i = len - 1 时(即最后一个字符), i + 1 越界直接跳过了 while 循环    left++;    right--;    // 如果当前的回文数长度大于之前的最大回文数, 则储存当前的回文数    if (right - left > maxPalStrRight - maxPalStrLeft) {      maxPalStrLeft = left;      maxPalStrRight = right;    }  };  for (let i = 0; i < len; i++) {    expandAroundCenter(i, i); // 假设有基数长度的回文数,即回文数中心点有一个字母    expandAroundCenter(i, i + 1); // 假设有偶数长度的回文数, 即回文数中心点有两个字母,且这两个字母相同  }  return s.slice(maxPalStrLeft, maxPalStrRight + 1);};// testconsole.log(longestPalindrome('babad'));console.log(longestPalindrome('cbbd'));console.log(longestPalindrome('bacd'));console.log(longestPalindrome('a'));console.log(longestPalindrome('bananas'));console.log(longestPalindrome('aaabaaaa'));console.log(longestPalindrome('ab'));

边界情况:
以字符串 ab 为例, 调用 expandAroundCenter(i, i + 1), 即expandAroundCenter(1, 2)

1234567891011121314151617181920
// len = 2const expandAroundCenter = (left, right) => {    // 应为right < len 不成立, while 循环被直接跳过了    while (left >= 0 && right < len && s[left] === s[right]) {      left--;      right++;    }    // 此时 left 的值为 1, right 的值为 2    left++;    right--;    // 此时 left 的值为 2, right 的值为 1        // right - left = 1 - 2 = -1, 而 maxPalStrRight - maxPalStrLeft的最小值是 0      // 此时 if 里的内容不可能被执行    if (right - left > maxPalStrRight - maxPalStrLeft) {      maxPalStrLeft = left;      maxPalStrRight = right;    }  };expandAroundCenter(1, 2)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!