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

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

  • 647.回文子串
    • 文章
    • 思路
    • 代码
  • 516.最长回文子序列
    • 文章
    • 思路
    • 代码
  • 总结

647.回文子串

文章

代码随想录|0647.回文子串

思路

dp[i][j]表示以i开头以j结尾的子串是否为回文子串
d[i][j]为TRUE的情况:
1)i==j
2)j==i+1&&s[i]==s[j]
3)dp[i+1][j-1]==true && s[i]==s[j]

代码

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

516.最长回文子序列

文章

代码随想录|516.最长回文子序列

思路

dp[i][j]表示以i开头以j结尾的子串中包含的最长回文子序列长度
当i==j时,dp[i][j]=1
当j==i+1时,若s[i]==s[j]则dp[i][j]=2否则dp[i][j]=1
其余情况,若s[i]==s[j]则dp[i][j]=dp[i+1][j-1]+2否则从dp[i+1][j]和dp[i][j-1]中取较大者

代码

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

总结

今天题目最关键的是遍历顺序了吧

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