本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、题目描述:
最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。 示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
示例 3:
输入:s = "a"
输出:"a"
示例 4:
输入:s = "ac"
输出:"a"
提示:
- 1 <= s.length <= 1000
- s 仅由数字和英文字母(大写和/或小写)组成
二、思路分析:
中心扩展法
- 回文一定是对称的
- 每次都选一个中心向两边扩展,比较两边字符串是否相等
- 回文字符串有两种
- aba 中心点是 b。 palindromeStr(s, i, i)
- aa 中心点是两个a中间。 palindromeStr(s, i, i+1)
- 两种方案得到的字符串与最开始 str 比较,把最长的字符串赋值给 str。这样str 中永远都是最长的回文字符串。
- 最后返回 str 即可
三、AC 代码:
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
let len = s.length, str = '';
for(let i = 0; i < len; i++){
let tem = '', tem2 = '';
tem = palindromeStr(s, i, i);
tem2 = palindromeStr(s, i, i+1);
if(tem.length > str.length) {
str = tem;
}
if(tem2.length > str.length) {
str = tem2;
}
}
return str;
};
// 获取回文字符串
var palindromeStr = function (s, left, right) {
while(left >= 0 && right < s.length && s[left] == s[right]) {
left--;
right++;
}
return s.slice(left + 1, right)
}
四、总结:
- 时间复杂度:O(n²)。
- 空间复杂度:O(1)。