回文字符串,js实现

19 篇文章 0 订阅
5 篇文章 0 订阅

回文字符串,js实现

描述

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

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例一:

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

示例2:

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

思路

这题最好想到的思路就是找到一个数然后从两端开始找,即中心扩散法

  1. 边界情况,首先长度是1时,直接返回,2的是否,如果两个字符相等,直接返回,否则返回任意一个
  2. 长度大于2时,任意取一个非边界字符,然后判断该字符两端是否相等,不相等则结束这个字符的回文判断
  3. 如果相等则继续取两端,知道不相等为止
  4. 由边界情况知,也可能起点位置的字符其相邻位置可能存在任意连续的相同字符,因此首先把该字符相邻的所有相同字符取出来,然后再开始从两端按照步骤2处理

算法如下

var longestPalindrome = function(s) {
    if (s.length === 1) {
        return s;
    } else if (s.length === 2) {
        if (s[0] === s[1]) {
            return s
        }
        return s[0]
    } else {
        let start = 1, left, right, i = 1;
        let end = s.length - 1;
        let result = ''
        // 选中某一位作为起点,向两端扩散
        for (start = 1; start < end; start++) {
            left = start;
            right = start;
            i = 1;
            // 首先找到左右相邻的连续相同字符
            while(left > 0 && s[start] === s[left - 1]) left--;
            while(right < end && s[start] === s[right + 1]) right++;
            // 边界条件,到达两端就是边界
            result = result.length < right - left + 1 ? s.substring(left, right + 1) : result;
            //console.log('初始值', result, start, left, right)
            while(left - i >= 0 && right + i <= end) {
                // 不符合回文数,退出本次查找,起始点前进
                if (s[left - i] !== s[right + i]) {
                    break;
                } else if (result.length < 2 * i + right - left + 1) {
                    // 当前回本长度大于结果集,存储最新的
                    result = s.substring(left - i, right + i + 1)
                    //console.log('找到的', result)
                }
                i++;
            }
            //console.log('result', result)
        }
        return result;
    }
};

ps:leetcode刷题随笔,欢迎交流

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值