力扣算法题-5.最长回文子串

已知题目描述为

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

例如:b a b a d的最长回文子串即是a b a

           c b a a b d的最长回文子串即是 b a a b

不难看出其实对于一个字符串的最长回文子串,实际上就是要找到一个‘中线’,往两边搜索,是否存在相同的字符

整体思路如下:

1.对于字符串长度小于2的字符串,直接return

2.需要创建两个变量,一个maxLen存储回文字符串的长度,一个start存储该回文子串出现的位置

3.封装一个函数,开始对每个位置进行‘中线’搜索,其中需要满足几个条件

  1. 左右边界不越界
  2. 左右两个字符相同

4.当满足以上条件的时候,需要判断是否要更新maxLen的长度,也就是是否有满足条件的更长字符串,满足的话更新maxLen,并且记录当前字符串的起始位置start

5.对字符串进行遍历搜索,并且需要考虑字符串长度为奇数和偶数的两种情况

代码如下

var longestPalindrome = function(s) {
  if(s.length < 2) return s

  let maxLength = 1;
  let start = 0;

  function expandAroundCenter(left, right){
    while(left >= 0 && right < s.length && s[left] === s[right]){
      if(right - left + 1 > maxLength){
        maxLength = right - left + 1;
        start = left;
      }
      left--;
      right++;
    }
  }
//因为helper function已经考虑过越界问题,所以循环遍历的时候,i从0开始取,不用担心越界问题

  for(let i = 0; i < s.length; i++){
    expandAroundCenter(i, i + 1);
    expandAroundCenter(i - 1, i + 1);
  }

  return s.substring(start, start + maxLength);
};

感谢大家的阅读,有问题欢迎讨论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值