代码随想录算法训练营第五十七天|LeetCode647. 回文子串、LeetCode516. 最长回文子序列

一、LeetCode647. 回文子串

题目链接:647. 回文子串
1、dp数组及下标含义:
dp[i][j]表示区间i、j的字符串是否是回文。
2、递推公式:

if(s[i] == s[j]) {
      if(j - i <= 1) {
           result++;
           dp[i][j] = true;
      } else if(dp[i + 1][j - 1]) {
           result++;
           dp[i][j] = true;
        }
    }
}

3、初始化:
vectordp(s.size(), vector(s.size(),false));
4、遍历顺序:
从下到上,从左到右;
5、打印dp数组
代码如下:

class Solution {
public:
    int countSubstrings(string s) {
        vector<vector<bool>>dp(s.size(), vector<bool>(s.size(),false));
        int result = 0;

        for(int i = s.size() - 1; i >= 0; i--) {
            for(int j = i; j < s.size(); j++) {
                if(s[i] == s[j]) {
                    if(j - i <= 1) {
                        result++;
                        dp[i][j] = true;
                    } else if(dp[i + 1][j - 1]) {
                        result++;
                        dp[i][j] = true;
                    }
                }
            }
        }
        return result;

    }
};

二、LeetCode516. 最长回文子序列

题目链接:516. 最长回文子序列
1、dp数组的下标及含义:
dp[i][j]表示区间为i、j的字符串中最长回文序列的长度。
2、递推公式:

 if(s[i] == s[j]) {
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                } else {
                    dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
                }

3、初始化:
for(int i = 0; i < s.size(); i++) dp[i][i] = 1;
4、遍历顺序:
跟上道题一样从下到上、从左到右。
5、打印dp数组;
代码如下:

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        vector<vector<int>>dp(s.size(), vector<int>(s.size(), 0));

        for(int i = 0; i < s.size(); i++) dp[i][i] = 1;

        for(int i = s.size() - 1; i >= 0; i--) {
            for(int j = i + 1; j < s.size(); j++) {
                if(s[i] == s[j]) {
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                } else {
                    dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
                }
            }
        }
        return dp[0][s.size() - 1];

    }
};

你可能感兴趣的:(C++算法题解,算法,leetcode,动态规划)