题目链接
题目描述
给你一个字符串 s
,找到 s
中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母组成
解题思路
中心扩散法
从每一个位置出发,向两边扩散即可。遇到不是回文的时候结束。下图举一个例子,str = acdbbdaa
,我们需要寻找从第一个b
出发的最长回文串
- 首先往左寻找与当期位置相同的字符,知道遇到不相等为止
- 然后往右寻找与当期位置相同的字符,直到遇到不相等为止
- 最后左右双向扩散,直到左和右不相等
每个位置向两边扩散都会出现一个窗口大小len
,如果len > maxLen
,则更新maxLen
的值。因为最后要返回的是具体子串,因此还需要记录一下maxLen
时的起始位置。
AC代码
class Solution {
public String longestPalindrome(String s) {
if (s.length() == 0) {
return s;
}
int sLen = s.length();
int left = 0;
int right = 0;
int len = 1;
int maxStart = 0;
int maxLen = 0;
for (int i = 0; i < sLen; i++) {
left = i - 1;
right = i + 1;
while (left >= 0 && s.charAt(left) == s.charAt(i)) {
len++;
left--;
}
while (right < sLen && s.charAt(right) == s.charAt(i)) {
len++;
right++;
}
while (left >= 0 && right < sLen && s.charAt(left) == s.charAt(right)) {
len += 2;
left--;
right++;
}
if (len > maxLen) {
maxLen = len;
maxStart = left;
}
len = 1;
}
return s.substring(maxStart + 1, maxStart + maxLen + 1);
}
}