代码随想录算法训练营 | 647. 回文子串,516.最长回文子序列

647. 回文子串
题目链接:647. 回文子串
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰回文子串
日期:2024-10-19

想法:本题精髓在于dp[i][j]表示的是s[i,j]这个子字符串是不是回文的,是Boolean类型,s[i]s[j]不等时,肯定不回文;s[i]s[j]相等时,开始看ij的大小,ij大小相等那么表示单个字符的情况,回文,大小差距为1,表示的是像“aa”这种情况,回文;大小差距大于1了,就得看这两个字符中间的子串是不是回文的了即看dp[i + 1][j - 1]是不是为true;初始化当然起始全部都是false;遍历顺序还有要注意由于有dp[i + 1][j - 1],所以列得从下往上走,行还是继续从左往右就行了。
Java代码如下:

class Solution {
    public int countSubstrings(String s) {
        char[] chars = s.toCharArray();
        int res = 0;
        int len = chars.length;
        boolean[][] dp = new boolean[len][len];
        for(int i = len - 1; i >= 0; i--) {
            for(int j = i; j < len; j++) {
                if(chars[i] == chars[j]) {
                    if(j - i <= 1) {
                        dp[i][j] = true;
                        res++;
                    }else if(dp[i + 1][j - 1]){
                        dp[i][j] = true;
                        res++;
                    }
                }
            }
        }
        return res;
    }
}

516.最长回文子序列
题目链接:516.最长回文子序列
文档讲解︰[代码随想录(programmercarl.com)](https://programmercarl.com/0516.最长回文子序列.html)
视频讲解︰最长回文子序列
日期:2024-10-19

想法:dp[i][j]表示s区间[i,j]中得最长子序列长度,跟上面字串是不一样的;s[i]s[j]相等,原长度dp[i + 1][j - 1]加2,不相等,就看是不要前一个长还是不要后一个长,即dp[i + 1][j]dp[i][j - 1];初始化显然dp[i][i]区间只有一个字符时长度为1;遍历顺序跟上面一样。
Java代码如下:

class Solution {
    public int longestPalindromeSubseq(String s) {
        char[] chars = s.toCharArray();
        int len = chars.length;
        int[][] dp = new int[len][len];
        for(int i = 0; i < len; i++) {
            dp[i][i] = 1;
        }

        for(int i = len - 1; i >= 0; i--) {
            for(int j = i + 1; j < len; j++) {
                if(chars[i] == chars[j]) {
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                }else {
                    dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
                }
            }
        }
        return dp[0][len - 1];
    }
}
posted @ 2024-10-19 20:32  漪欢酒  阅读(3)  评论(0编辑  收藏  举报