最长回文子串
2022/05/29
示例
示例一
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
示例二
输入:s = "cbbd" 输出:"bb"
思考过程
题解参考,动态规划
var longestPalindrome = function (s) {
  const len = s.length;
  // 如果字符串 长度为1,则回文子串为本身
  if (len < 2) {
    return s;
  }
  const dp = [];
  let maxLen = 1;
  let begin = 0;
  for (let i = 0; i < len; i++) {
    if (!dp[i]) {
      dp[i] = [];
    }
    dp[i][i] = true;
  }
  const charArray = s.split("");
  // 假设子串长度为L
  for (let L = 2; L <= len; L++) {
    // 第i个字母
    for (let i = 0; i < len; i++) {
      // j为第i个字母加上子串长度L - 1
      const j = L - 1 + i;
      // 当j大于等于字符串的时候,则获取不到字符,即结束遍历
      if (j >= len) {
        break;
      }
      // 第i个字母与第j个字母不同,则continue
      if (charArray[i] !== charArray[j]) {
        dp[i][j] = false;
        continue;
      } else {
        // 若第i个字母与第j个字母的距离小于3的情况:
        // babad中的: bab
        // cbbd中的: bb
        if (j - i < 3) {
          dp[i][j] = true;
        } else {
          // 否则再判断内一层的字符是否相等(回文规则)
          // ababa中,第0个字符与第4个字符相等,接着判断第1个字符与第3个字符是否相等
          // 若不相等,说明0到4的这串字符串不是回文
          dp[i][j] = dp[i + 1][j - 1];
        }
      }
      // s[i:j]是回文串,判断其长度是否大于当前记录的maxLen,是的话则更新maxLen与begin
      if (dp[i][j] && j - i + 1 > maxLen) {
        maxLen = j - i + 1;
        begin = i;
      }
    }
  }
  // 从字符串s中截取begin到begin + maxLen的子串,则是最长回文子串
  return s.substring(begin, begin + maxLen);
};