LeetCode:5. 最长回文子串

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

示例 1:

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

示例 2:

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

提示:

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

解题思路

1.如果是回文子串,那么它的左右两边的元素肯定是对称的,可以使用左右指针,从当前元素向两边扩散,以找到最长子串。
2.首先遍历字符串,然后分两种情况来查找当前的最长回文串:

  • 寻找长度为奇数的回文子串(以当前元素向两边扩散),如 ‘a’
  • 寻找长度为偶数的回文子串(以s[i],s[i + 1])向两边扩散,如 ‘bb’

3.最后再找出长度最长的回文子串返回即可

代码

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    let res = '';
    const palindrome = (s, l, r) => {
        // 左右指针,从s[l]和s[r]向两边扩散,找到最长回文串
        while(l >= 0 && r < s.length && s[l] === s[r]) {
            l--; 
            r++;
        }
        return s.substr(l + 1, r - l - 1);
    }
    for(let i = 0; i < s.length; i++) {
        // 寻找长度为奇数的回文子串(以当前元素向两边扩散)
        const s1 = palindrome(s, i, i);
        // 寻找长度为偶数的回文子串(以s[i],s[i + 1])向两边扩散
        const s2 = palindrome(s, i, i + 1);
        res = res.length > s1.length ? res : s1;
        res = res.length > s2.length ? res : s2;
    }
    return res;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值