前言
因为5月太忙了,没啥时间整理所学的知识啦,但是今年的目标是每个月输出至少两篇,所以俺就发一些之前做的LeetCode算法解答。
题目:寻找两个正序数组的中位数
题目来源: 最长回文子串 - 力扣(LeetCode)
给你一个字符串 s
,找到 s
中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入: s = "babad"
输出: "bab"
解释: "aba" 同样是符合题意的答案。
示例 2:
输入: s = "cbbd"
输出: "bb"
提示:
1 <= s.length <= 1000
s仅由数字和英文字母组成
解题思路
- 直接先把最长和最短的回文数排了,不让它继续往下执行
- 把字符串反转看看是否相同,相同则输出所有
- 写个函数从左到右遍历字符串,注意区分字符串长度为奇数和偶数的情况
代码
/**
@param {string} s
@return {string}
*/
var longestPalindrome = function(s) {
//直接先把最长和最短的回文数排了,不让它继续往下执行
//把字符串反转看看是否相同,相同则输出所有
//测试了一下,加了这个判断能稳定提升20ms左右
if (s === s.split('').reverse().join('')) {
return s;
}
// 定义一个空字符串来接收回文串
let res = '';
for (let i = 0; i < s.length; i++) {
//当回文数中心为奇数时执行此方法
//比如aba,中心是b
computedData(i, i);
//当回文数中心为偶数时执行此方法
//比如baab,中心是aa
computedData(i, i + 1);
}
function computedData(left, right) {
while (left >= 0 && right < s.length && s[left] === s[right]) {
left--;
right++;
}
if (res.length < right - left - 1) {
res = s.slice(left + 1, right);
}
}
return res
};