【LeetCode】 ---- _5_最长回文子串(动态规划)

链接:

https://leetcode-cn.com/problems/longest-palindromic-substring/

题目:

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

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

输入: "cbbd"
输出: "bb"

Code:

class Solution {
    public String longestPalindrome(String s) {
        if(s == null) return null;
        char[] chars = s.toCharArray();
        if(chars.length == 0) return s;
        // 最长回文子串的长度(至少是1)
        int maxLen = 1;
        // 最长回文子串的开始索引
        int begin = 0;
        boolean[][] dp = new boolean[chars.length][chars.length];
        // 从下到上(i由大到小)
        for (int i = chars.length-1; i >= 0; i--) {
            // 从左到右(j由小到大)
            for (int j = i; j < chars.length; j++) {
                // chars[i, j]的长度
                int len = j - i + 1;
                // chars[i,j]长度<=2 和>2 情况
                dp[i][j] = (chars[i] == chars[j]) && (len <= 2 || dp[i+1][j-1]);
                if(dp[i][j] && len > maxLen) {  // 说明chars[i,j]是回文子串
                    maxLen = len;
                    begin = i;
                }
            }
        }
        return new String(chars, begin, maxLen);
    }
}
  • 时间复杂度: O(n^2)
  • 空间复杂度: O(n^2)

解题思路:

  1. 定义了二维dp布尔类型数组,dp[i][j]表示s[i,j]是回文子串

  2. 定义好状态转移方程

  3. dp[i][j]值计算
    分两种情况:

    • 如果s[i,j] 长度(j-i+1) <= 2时,如果s[i]==s[j], 那么s[i,j]是回文串 => dp[i][j] = s[i] == s[j]
    • 如果s[i,j]长度(j-i+1) > 2时,如果s[i+1][j-1]是回文串, 并且s[i]==s[j] => s[i,j]是回文串
      dp[i][j] = dp[i+1][j-1] && (s[i] == s[j])
  4. 图片辅助理解
    dp[i][j] 代表 s[i,j],从下到上
    【LeetCode】 ---- _5_最长回文子串(动态规划)_第1张图片

    // 从下到上(i由大到小)
            for (int i = chars.length-1; i >= 0; i--) {
                // 从左到右(j由小到大)
                for (int j = i; j < chars.length; j++) {
                    // chars[i, j]的长度
                    int len = j - i + 1;
                    // chars[i,j]长度<=2 和>2 情况
                    dp[i][j] = (chars[i] == chars[j]) && (len <= 2 || dp[i+1][j-1]);
                    if(dp[i][j] && len > maxLen) {  // 说明chars[i,j]是回文子串
                        maxLen = len;
                        begin = i;
                    }
                }
            }
    

    【LeetCode】 ---- _5_最长回文子串(动态规划)_第2张图片
    s[i,j]长度(j-i+1) > 2时, dp[i][j] = dp[i+1][j-1] && (s[i] == s[j])

参考:

  • MJ老师《恋上数据结构》
  • labuladong公众号

总结:

  • 自己算法太薄弱了,一天一道力扣不能少,看视频也好,跟着敲也好,一天至少一道!!!
  • 博客至少每天一篇!!!
  • 时间尽量控制好!!!好好看书籍、多总结

你可能感兴趣的:(LeetCode)