5. 最长回文子串
难度中等5258收藏分享切换为英文接收动态反馈
给你一个字符串 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) {
// 边界处理,数组为空或者长度为1时
if (!s || s.length === 1) {
return s;
}
let maxLen = 0;
let longStr = '';
// 遍历
for(let i = 0; i < s.length - 1; i++) {
for(let j = i + 1; j <= s.length; j++) {
let str = s.substring(i, j);
// console.log(str);
if (str.length > maxLen && str === str.split('').reverse().join('')) {
maxLen = str.length;
longStr = str;
}
}
}
return longStr;
};
优化
两种情况
一种是回文子串长度为奇数(如aba,中心是b) 另一种回文子串长度为偶数(如abba,中心是b,b)
循环遍历字符串 对取到的每个值 都假设他可能成为最后的中心进行判断,返回最长的回文子串
var longestPalindrome = function(s) {
// 处理边界情况,s为空或者长度为1时
if (s.length < 2) {
return s;
}
let maxStr = '';
for(let i = 0; i < s.length; i++) {
// 奇数回文子串,假设i为回文中心点
let left = i - 1;
let right = i + 1;
while(left >= 0 && right < s.length && s[left] === s[right]){
left -- ;
right ++;
}
if (right - left - 1 > maxStr.length) {
maxStr = s.substring(left + 1, right);
}
// 偶数回文子串,假设为回文的left
left = i;
right = i + 1;
while(left >= 0 && right < s.length && s[left] === s[right]){
left -- ;
right ++;
}
if (right - left - 1 > maxStr.length) {
maxStr = s.substring(left + 1, right);
}
}
return maxStr;
}