動態規劃——leetcode5、最長迴文子串

1、題目描述:

2、解題方法:動態規劃

  動態規劃解題步驟:

    1、確定狀態

      • 最後一步:如果s[i,…,j]是迴文子串,那麼需要滿足兩個條件

        ① s[i] == s[j];

        ② s[i+1,…,j-1]是迴文子串;

      • 子問題:我們要驗證s[i+1,…,j-1]是不是迴文子串
      • 用dp[i][j]來表示s[i,…,j]是不是迴文子串

    2、轉移方程

      dp[i][j] = (s[i] == s[j])&& dp[i+1][j-1]

    3、初始條件和邊界情況

      初始條件:dp[i][i] == true;

      邊界條件:在s[i] == s[j]的條件下,j-i<=2或者j-i<3,即說明s[i,…,j]的長度為2或者是3時,不用檢查是不是迴文串。

      

    4、計算順序

     以字元串s:babab為例,一列一列的進行填表,先升序填列,再升序填行。

       

3、程式碼:

public String longestPalindrome(String s) {
        int len = s.length();
        if(len < 2){
            return s;
        }
        int maxLen = 1;
        int start = 0;
        char[] res = s.toCharArray();
        boolean[][] dp = new boolean[len][len];

        for(int i = 0; i < len; i++){
            dp[i][i] = true;
        }
        for(int j = 1; j < len; j++){
            for(int i = 0; i < j; i++){
                if(res[i] == res[j]){
                    if(j - i < 3 || dp[i+1][j-1] == true){
                        dp[i][j] = true;
                    }
                    if( j-i+1 > maxLen && dp[i][j] == true){
                        maxLen = j-i+1;
                        start = i;
                    }
                }
            }
        }
        return s.substring(start,start + maxLen);
    }

 

Tags: