代码随想录算法训练营 Day 57 | 647.回文子串,516.最长回文子序列,动态规划总结篇

647.回文子串

讲解链接:代码随想录-647.回文子串

动态规划解法
public int countSubstrings(String s) {
    if (s == null || s.length() < 1) return 0;
    int len = s.length();
    int result = 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)) {
                if (j - i < 3) {
                    dp[i][j] = true;
                    result++;
                } else if (dp[i + 1][j - 1]) {
                    dp[i][j] = true;
                    result++;
                }
            }
        }
    }
    return result;
}
双指针解法
public int countSubstrings(String s) {
    int result = 0;
    for (int i = 0; i < s.length(); i++) {
        result += extend(s, i, i);
        result += extend(s, i, i + 1);
    }
    return result;

}

int extend(String s, int i, int j) {
    int res = 0;
    while (i >= 0 && j < s.length() && s.charAt(i) == s.charAt(j)) {
        i--;
        j++;
        res++;
    }
    return res;
}

516.最长回文子序列

讲解链接:代码随想录-516.最长回文子序列

public int longestPalindromeSubseq(String s) {
    int len = s.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 (s.charAt(i) == s.charAt(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];
}

动态规划总结篇

讲解链接:代码随想录-动态规划总结篇

你可能感兴趣的:(算法,动态规划)