Longest Palindromic Substring

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

Analysis

  • 用start, end记录最长palindrome的位置
  • i从0开始,每次找在i附近展开的最大palindrome长度,如果比之前长就更新start和end的位置
  • 用helper function 来 return i附近palindrom的长度
  • 用len1和len2保证奇数和偶数长度palindrome都能考虑到

Code

public class Solution {
    public String longestPalindrome(String s) {
        if (s==null || s.length()<=1) return s;
        //start and end record the longest substring start end positions
        int start = 0, end = 0;

        //for each i, expand around i to find the longest palindrome substring around i
        for(int i=0; i<s.length();i++){
            int oddlen = palindrome(s, i, i); //odd length palindrome
            int evenlen = palindrome(s, i, i+1); //even length palindrome
            int len = Math.max(oddlen, evenlen);
            if (len > end-start+1){ //update substring length if larger
                start = i-(len-1)/2;
                end = i+len/2;
            }
        }
        return s.substring(start, end+1);
    }

    //return longest palindrome length expand around position L and R
    private int palindrome(String s, int L, int R){
        while(L>=0 && R<s.length() && s.charAt(L)==s.charAt(R)){
            L--;
            R++;
        }
        return R-L-1;
    }
}

Time/space complexity

  • Time: O(n^2)
  • Space: O(1)

Reference

Clean code book