1. 程式人生 > >Leetcode5 Longest Palindromic Substring

Leetcode5 Longest Palindromic Substring

太久不做題了…這道題做了好久。

這是一道Tag是DP的題。於是自己開始就按DP的思路去做了。但是最後發現貌似並不是典型DP,而是DP+遞迴+雙指標(?),個人菜雞感覺。

看了Solution,總結下思考過程。

首先暴力解法,相當於在一個長度為n的字串裡選擇兩個數分別作為字串的開始和結尾,然後對這個子字串是否迴文做判斷(如何做判斷?和括號匹配並不一樣,一個stack並不夠用,留待以後解決)。時間複雜度$C_n^2=\frac{n(n-1)}{2}=O(n^2)$,乘上判斷迴文複雜度,共計O(n^3)。空間複雜度O(1):只需要儲存maxLen,leftIndex,rightIndex。

然後就開始想DP了。

首先想到的是,一個字串,對應的不應該是最大欄位和或者最長遞增子序列問題嘛?

於是寫了一版,但是發現對"ababa"就無法判斷,而且沒有解決辦法。事實證明,一維DP並不夠用。

然後想,那應該二維DP,像Solution中的方法3。但是這個是從中間往兩邊迴圈的,稍顯麻煩,不過是可以做的。

Solution中的方法1,LCS也並不適用,和我的一維DP一樣,思考不夠全面。

所以,採用了方法https://leetcode.com/problems/longest-palindromic-substring/discuss/2928/Very-simple-clean-java-solution。(DP+)遞迴+雙指標(?)

public class longestPalindromeSubstring5 {
    private int leftIndex=0,maxLen=1;
    private void extendPalindrome(String s,int l,int r) {
        while(l>=0 && r<s.length() && s.charAt(l)==s.charAt(r)) {
            l--;r++;
        }
        if(r-l-1>maxLen) {
            maxLen
=r-l-1; leftIndex=l+1; } } public String longestPalindrome(String s) { if (s.length()<2) return s; for(int i=0;i<s.length()-1;i++) { extendPalindrome(s, i, i); //assume odd length, try to extend Palindrome as possible extendPalindrome(s, i, i+1); //assume even length. } return s.substring(leftIndex, leftIndex+maxLen); } }

20ms,68.13%。還需優化。

時間複雜度O(n^2)空間複雜度O(1)。