[LeetCode]最長回文子串 java


題目:

給定一個字符串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為1000。

示例 1:

輸入: "babad"
輸出: "bab"
注意: "aba"也是一個有效答案。
示例 2:

輸入: "cbbd"
輸出: "bb"

  

我知道的有兩種方法,還有幾種,我還沒來得及學會...

一種是暴力

這種就是直接將所有的子串都枚舉出來,然后逐個判斷求出結果,不用想都知道,這種不是好的解法

因為時間復雜度會很高,會達到O(n³)

第二種是動態規划

先建立一個二維數組dp,令dp[i][j]表示s[i...j] = 1是回文字符串,用其等於0則表示不是回文子串

當然我這里這樣遇到了內存問題,貌似是數組開太大了的yuanyin,所有這里最好用boolean類型的

二維數組,那么由 上面的定義就可以知道,如果s.charAt(i)==s.charAt(j)並且dp[i+1][j-1]里面是true,則

dp[i][j]也為true,之后就可以開始做了

先將數組初始化,即相鄰兩個相同的字母組成的子串和單個的字母都是回文串

所以dp[i][i]為true,dp[i][i+1]也為true

之后再從最長回文子串為3開始篩選,如果長度比已知的最長回文子串長,那么就更新最長回文子串,ok思想就是這樣

這里我把數組的初始化和后面的篩選放在一起了

public static String longestPalindrome(String s) {
        if (s.length()<=1)
            return s;
        String longest = s.charAt(0)+"";
        int length = s.length();
        boolean[][] dp = new boolean[length][length];
        for(int j = length-1;j>=0;j--){
            //j在前,i在后
            for(int i = j;i<length;i++){
                dp[j][i] = s.charAt(i)==s.charAt(j)&&((i-j<3)||dp[j+1][i-1]);
                if(dp[j][i]&&i-j+1>longest.length()){
                    longest = s.substring(j,i+1);
                }
            }
        }
        return longest;
    }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM