题目
给你一个字符串 s
,找到 s
中最长的回文子串。
解题思路
常规思路是枚举每一个子串的中心,然后用两个指针分别向两边扩展,直到两个指针指到不相同的元素。最后把这个过程中最长子串的状态记录下来即可。时间复杂度O(n 2 ^{2} 2)。
官方给了个 Manacher
算法,那个时间复杂度是O(n),懒得看了。
代码
class Solution {
public String longestPalindrome(String s) {
int length = s.length(), ansLength = 0, ansLeft = 0, ansRight = 0;
for (int i = 0; i < length; i++) {
int left = i - 1, right = i + 1, len = 1;
while (left >= 0) {
if (s.charAt(left) != s.charAt(i)) break;
left--;
len++;
}
while (right < length) {
if (s.charAt(i) != s.charAt(right)) break;
right++;
len++;
}
while (left >= 0 && right < length) {
if (s.charAt(left) != s.charAt(right)) break;
len += 2;
left--;
right++;
}
if (len > ansLength) {
ansLength = len;
ansLeft = left;
ansRight = right;
}
}
return s.substring(ansLeft + 1, ansLeft + 1 + ansLength);
}
}