最长回文子串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);
    }

猜你喜欢

转载自blog.csdn.net/qmylzx/article/details/83343395