自学内容网 自学内容网

【代码随想录Day45】动态规划Part13

647. 回文子串

题目链接/文章讲解:代码随想录
视频讲解:动态规划,字符串性质决定了 DP 数组的定义 | LeetCode:647.回文子串_哔哩哔哩_bilibili

class Solution {
    public int countSubstrings(String s) {
        // 将字符串转换为字符数组,便于后续处理
        char[] chars = s.toCharArray();
        int len = chars.length;  // 获取字符串的长度

        // 创建一个二维布尔数组,用于记录子串是否为回文
        boolean[][] dp = new boolean[len][len];
        int result = 0;  // 用于计数回文子串的数量

        // 从字符串的最后一个字符开始向前遍历
        for (int i = len - 1; i >= 0; i--) {
            // 从当前字符位置向后遍历
            for (int j = i; j < len; j++) {
                // 如果两个字符相等
                if (chars[i] == chars[j]) {
                    // 情况一:字符间隔为0(相同的字符)或情况二:字符间隔为1(两个相同字符组成的子串)
                    if (j - i <= 1) {
                        result++;  // 计数加一
                        dp[i][j] = true;  // 标记为回文
                    }
                    // 情况三:判断子串中间部分是否为回文
                    else if (dp[i + 1][j - 1]) {
                        result++;  // 计数加一
                        dp[i][j] = true;  // 标记为回文
                    }
                }
            }
        }
        return result;  // 返回回文子串的总数量
    }
}

516.最长回文子序列

题目链接/文章讲解:代码随想录
视频讲解:动态规划再显神通,LeetCode:516.最长回文子序列_哔哩哔哩_bilibili

class Solution {
    public int longestPalindromeSubseq(String s) {
        // 将字符串转换为字符数组
        char[] chars = s.toCharArray();
        int len = chars.length;

        // 创建一个二维数组 dp,用于存储子问题的解
        int[][] dp = new int[len][len];

        // 初始化 dp 数组,所有单字符的回文子序列长度为 1
        for (int i = 0; i < len; i++) {
            dp[i][i] = 1;  // 单个字符的回文子序列长度为 1
        }

        // 从后向前遍历字符串
        for (int i = len - 1; i >= 0; i--) {
            // 从 i+1 开始遍历,确保 j 始终大于 i
            for (int j = i + 1; j < len; j++) {
                // 如果当前字符相同,则找到一个回文子序列
                if (chars[i] == chars[j]) {
                    // 当前字符相同,回文长度为 dp[i + 1][j - 1] + 2
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                } else {
                    // 如果字符不同,取去掉当前字符后得到的最大回文子序列长度
                    dp[i][j] = Math.max(dp[i][j - 1], dp[i + 1][j]);
                }
            }
        }

        // 返回从字符串开始到结束的最长回文子序列长度
        return dp[0][len - 1];
    }
}

动态规划总结篇

总结:代码随想录


原文地址:https://blog.csdn.net/weixin_43724673/article/details/143061860

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!