【代码随想录训练营】【Day57】第九章|动态规划|647.回文子串|516.最长回文子序列|动态规划总结

回文子串

题目详细:LeetCode.647

详细的题解可查阅:《代码随想录》— 回文子串

Java解法(动态规划):

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

最长回文子序列

题目详细:LeetCode.516

详细的题解可查阅:《代码随想录》— 最长回文子序列

Java解法(动态规划):

class Solution {
    public int longestPalindromeSubseq(String s) {
        int len = s.length(), res = 0;
        int[][] dp = new int[len][len];
        for(int i = len - 1; i >= 0; i--){
            for(int j = i; j < len; j++){
                if(s.charAt(i) == s.charAt(j)){
                    if(j - i <= 2){
                        dp[i][j] = j - i + 1;
                    }else if(dp[i + 1][j - 1] > 0){
                        dp[i][j] = dp[i + 1][j - 1] + 2;
                    }
                }else{
                    dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
                }
                res = Math.max(res, dp[i][j]);
            }
        }
        return res;
    }
}

动态规划总结

详细的总结可查阅:《代码随想录》— 动态规划总结篇

你可能感兴趣的:(代码随想录训练营,动态规划,leetcode,算法)