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;
        }
    }
}

大米中的大米
12 声望5 粉丝

你的code是面向面试编程的,收集和整理leetcode discussion里个人认为的最优且最符合我个人思维逻辑的解法。