5. 最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
解题思路1:双指针扩展中心法
/*
寻找回文串的问题核心思想是:从中间开始向两边扩散来判断回文串。
*/
class Solution {
public String longestPalindrome(String s) {
//空间复杂度O(1)
String res = "";
if(s == null || s.length() == 0) {
return res;
}
for(int i = 0; i < s.length(); i++) {
// 以 s[i] 为中心的最长回文子串
String s1 = palindrome(s, i, i);
// 以 s[i] 和 s[i+1] 为中心的最长回文子串
String s2 = palindrome(s, i, i + 1);
if(res.length() < s1.length()) {
res = s1;
}
if(res.length() < s2.length()) {
res = s2;
}
}
return res;
}
//使用双指针,l和r从字符串中心向字符串两边出发,寻找最长回文串
//为什么要传入两个指针 l 和 r 呢?因为这样实现可以同时处理回文串长度为奇数和偶数的情况:
public String palindrome(String s, int l, int r) {
// 防止索引越界
while(l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)) {
// 向两边展开
l--;
r++;
}
// 返回以 s[l] 和 s[r] 为中心的最长回文串
return s.substring(l + 1, r);
}
}
复杂度分析:
时间复杂度 O(N^2),空间复杂度 O(1)。
解题思路2:动态规划
值得一提的是,这个问题可以用动态规划方法解决,时间复杂度一样,但是空间复杂度至少要 O(N^2) 来存储 DP table。这道题是少有的动态规划非最优解法的问题。