给你一个字符串 s
,找到 s
中最长的回文子串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd" 输出:"bb"
提示:
1 <= s.length <= 1000
s
仅由数字和英文
思路:遍历中心外扩法
1、从某一字符开始,两种情况,单中心(..bab..)或者双中心(..baab..),取更长的
2、遍历整个字符串,找到最长的,并计算出此时的收尾字符
3、返回最长回文子串
var longestPalindrome = function(s) { if(!s) return '' let start = 0,end = 0,n = s.length; let len = 0,len1 = 0,len2 = 0; for(let i = 0;i < n;i++){ //单字符为中心 len1 = currentLongest(s,i,i) //双字符为中心 len2 = currentLongest(s,i,i+1) len = Math.max(len1,len2) //找到最长回文字符串的起始和结束位置 if(len > end - start){ start = i - Math.floor((len - 1) / 2); end = i + Math.floor(len / 2); } } return s.substring(start,end+1) }; //左右扩展寻找最长回文长度 function currentLongest(s,left,right){ while(left >= 0 && right < s.length && s[left] == s[right]){ left--; right++; } return right - left -1; }
复杂度分析
-
时间复杂度:O(n²),其中 n 是字符串的长度。长度为 1 和 2 的回文中心分别有 n 和 n−1 个,每个回文中心最多会向外扩展O(n) 次。
-
空间复杂度:O(1)。