动态规划——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: