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

示例1:

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

示例2:

  1. 输入:s = "cbbd"
  2. 输出:"bb"

示例3:

  1. 输入:s = "a"
  2. 输出:"a"

示例4:

  1. 输入:s = "ac"
  2. 输出:"a"

解析:

  1. let s = 'abcddcba'
  2. let res = '';
  3. // 遍历每个可能的中心点位,以左右指针模拟中心点
  4. for (let i = 0; i < s.length; i++) {
  5. // 双数情况
  6. getCenter(i, i);
  7. // 单数情况
  8. getCenter(i, i + 1);
  9. }
  10. // 本函数的作用为:获取最长的,以本中心点为中心的回文串
  11. function getCenter(left, right) {
  12. // 边界条件:左指针不小于0,右指针不超过数组的最长长度。
  13. // 进入循环条件:满足边界条件,且当前两个指针指向的字符相等
  14. while (left >= 0 && right < s.length && s[left] == s[right]) {
  15. // 左侧指针左移,右侧指针右移,开启下次字符相等的判断循环。当超出系统边界或两指针指向的字符不相等,则退出
  16. left--;
  17. right++;
  18. }
  19. // 循环结束,两指针目前指向的字符串中间其实是不满足回文串
  20. // 事实上本次while获得的回文串的左侧为left + 1,右侧为right - 1
  21. // 所以本次获得的回文串长度为 (right - 1) - (left + 1) + 1 = right - left - 1,与res长度判断后取最长的回文子串
  22. if (right - left - 1 > res.length) {
  23. // 记住这里需要截取的是正确的回文子串,所以要消除while循环中,最后一次不满足条件的left、right的影响
  24. /**
  25. * left => left + 1
  26. * right - 1 => right - 1 + 1 = right
  27. **/
  28. res = s.slice(left + 1, right);
  29. }
  30. }
  31. console.log(res) // 'abcddcba'