给定一个字符串,找到其中最长的回文子串。回文是指正读和反读都相同的字符串。
算法思路
- 中心扩展法:回文串可以从其中心展开,中心可以是一个字符(奇数长度)或两个字符之间的空隙(偶数长度)。
- 遍历所有中心:对于字符串中的每一个字符和每两个字符之间的空隙,尝试向两边扩展,直到无法形成回文为止。
- 记录最长回文:在扩展过程中,记录遇到的最长回文子串的起始和结束位置。
Java实现
class Solution {
public String longestPalindrome(String s) {
if (s == null || s.length() < 1) return "";
int start = 0, end = 0;
for (int i = 0; i < s.length(); i++) {
int len1 = expandAroundCenter(s, i, i); // 奇数长度
int len2 = expandAroundCenter(s, i, i + 1); // 偶数长度
int len = Math.max(len1, len2);
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substring(start, end + 1);
}
private int expandAroundCenter(String s, int left, int right) {
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
left--;
right++;
}
return right - left - 1;
}
}
代码解释
- longestPalindrome方法:
- 初始化:
start
和end
用于记录最长回文子串的起始和结束位置。 - 遍历中心:对每个字符和每两个字符之间的空隙,调用
expandAroundCenter
计算回文长度。 - 更新最长回文:根据返回的回文长度,更新
start
和end
。
- 初始化:
- expandAroundCenter方法:
- 中心扩展:从给定的
left
和right
开始,向两边扩展,直到字符不相等或越界。 - 返回长度:返回当前回文的长度(
right - left - 1
)。
- 中心扩展:从给定的
复杂度分析
- 时间复杂度:O(n²),其中n是字符串的长度。每个字符最多被访问两次(一次作为奇数中心,一次作为偶数中心)。
- 空间复杂度:O(1),仅使用了常数级别的额外空间。
通过中心扩展法,可以高效地找到最长的回文子串。该方法利用了回文的对称性质,从每个可能的中心向两边扩展,确保了算法的正确性和效率。