挑战Leetcode刷题30天,[5]最长回文子串

41 阅读1分钟

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

Related Topics

  • 字符串
  • 动态规划

解题思路

  • 回文串无非就是两种情况:abba和aba,可以看到一个是奇数,一个是偶数。

  • 知识点一:怎么求回文?

  • 我们的思路就是,从中间开始,向两边同时遍历,当左右元素一样的时候,代表满足回文条件。
    一直循环这个过程去判断,直到左右不相等,截取这一段就好了。

  • 知识点二:从哪个字符开始向两边找?

  • 答案是从头开始遍历,我们把每一个字符串都当做是中间字符串,向两边寻找

代码

//leetcode submit region begin(Prohibit modification and deletion)
/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function (s) {
  if (s.length < 2) {
    return s;
  }
  let target = "";
  //从哪个字符开始向两边找?
  for (var i = 0; i <= s.length; i++) {
    fun(i, i);
    fun(i, i + 1);
  }
  //怎么求回文?
  function fun(left, right) {
    while (left >= 0 && right <= s.length - 1 && s[left] == s[right]) {
      --left;
      right++;
    }
    //substring:从第一个参数开始,到第二个参数的前一个(包含第一个,不包含第二个)
    // 例: 'abcd'.substring(1,3)=>'bc'
    if (s.substring(left + 1, right)?.length > target?.length) {
      target = s.substring(left + 1, right);
    }
  }
  return target;
};
console.log(longestPalindrome("babad"));
//leetcode submit region end(Prohibit modification and deletion)

截图