这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战
最长回文子串
Hot100 5.最长回文子串
难度:中等
给你一个字符串s
,找到s
中最长的回文子串。
示例1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例2:
输入:s = "cbbd"
输出:"bb"
示例3:
输入:s = "a"
输出:"a"
示例4:
输入:s = "ac"
输出:"a"
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母(大写和/或小写)组成
题解
中心扩展法
回文串既是正着读和反着读都一样的字符串,其长度可能是奇数或者偶数,而解决此类问题需要使用双指针。
故我们需要从中间开始向两边扩散来判断回文串:
- 找中心,对于奇数需要找到
s[i]
为中心的回文串即可,而对于偶数需要找到s[i]
和s[i+1]
为中心的回文串 - 使用左右指针往两边扩散,同时要防止越界,获取长度为奇数和偶数中回文子串的长度,并选择其中较大的那一个进行返回。
/**
* @param {string} s
* @return {string}
*/
function longestPalindrome(s) {
let res = '';
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;
};
function 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);
}
时间复杂度:O(N^2)
空间复杂度:O(1)
坚持每日一练!前端小萌新一枚,希望能点个赞
+在看
哇~