Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
暴力算法就是找到所有substring, 每个都进行isPalindrome的检查。时间复杂度是O(N^3). N^2个substring, 调用isPalindrome平均时长为O(N).
这里唯一确定substring用的是头尾(i,j)表示。因为palindrome的对称性,我们可以从中间出发向两边延展,找到最长的palindrome.
分为ABA, ABBA两种基本情况。一共有N个位置唯一标记点,调用一次extenPalindrome时间worst case是O(len),
最大也就是中点位置的O(n/2). 总的时间复杂度大致为O(N^2/4)
另外还有一种方法,想法来自于palindrome partition那题。 用一个boolean[i,j]表示(i,j)是否为palindrome,
比较i-1和j+1. 写过一个,代码复杂,跑起来特别慢,特别是"aaaaaaa"这种,所以抛弃掉。
public class Solution {
private int lo = 0, maxLen = 0;
public String longestPalindrome(String s) {
if(s.isEmpty()) return null;
int len = s.length();
if(len < 2) return s;
for(int i=0; i<len-1; i++) {
extendPalindrome(s, i, i); // 奇数长度出发点一致,都为i
extendPalindrome(s, i, i+1); // 偶数长度出发点为相邻的点, i和i+1
}
return s.substring(lo, lo+maxLen);
}
public void extendPalindrome(String s, int j, int k){
while(j >= 0 && k < s.length() && s.charAt(j) == s.charAt(k)){
j--;
k++;
}
// 结束是s(j)!=s(k)
// k-1 - (j+1) +1 = k - j -1
if(maxLen < k - j - 1){
lo = j + 1;
maxLen = k - j - 1;
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。