1. 程式人生 > >最長迴文子串DP

最長迴文子串DP

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

示例 1:

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

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

分析:dp    dp[ j ][ i ] 表示從 j i 的子串 ,

dp[ j ][ i ] 為迴文串,則  dp[ j+1 ][ i-1 ] 必然迴文 ,有如下關係

dp[ j ][ i ] =true  when  dp[ j+1 ][ i-1 ]  =true

&& charAt(i)==s.charAt(j)   i - j>1;

dp[ j ][ i ] =true   when  s.charAt(i)==s.charAt(j)   i - j>1 ,即 i = j + 1

dp[ j ][ i ] =true   when   i=j;

    static String ff(String s){
        int n=s.length();
        boolean[][] dp =new boolean[n][n];
        int max_len=1; //儲存最長迴文子串長度
        int start=0;//儲存最長迴文子串起點
        for(int i=0;i<s.length();++i)
        {
            for(int j=0;j<=i;++j)
            {
                if(i-j<2)
                    dp[j][i]=(s.charAt(i)==s.charAt(j));
                else
                    dp[j][i]=(s.charAt(i)==s.charAt(j)&& dp[j+1][i-1]);
                if(dp[j][i] && max_len<(i-j+1))
                {
                    max_len=i-j+1;
                    start=j;
                }
            }
        }
        for (boolean[] booleen : dp) {
            for (boolean b : booleen) {
                System.out.print(b+"\t");
            }
            System.out.println();
        }
        return s.substring(start,start+max_len);
    }