Bootstrap

代码随想录算法训练营第四十六天-动态规划-647. 回文子串

  • 如果按照正常想法,根据题目要求来定义一个一维数组来记录递推关系,会发现根本找不到可以递推的关系
  • 所以要考虑其它方式来定义递归数组
  • 动规五部曲
    • dp[i][j]表示子串以i开始以j结束是回文串
    • 递推公式:
      • if (s[i] == s[j])会有三种情况与之对应
        • i == j情况下百分百是回文串
        • i != j如果位置仅相差1(说明是相邻的)
        • 如果位置相差大于1,是不是回文串是由内部的回文串决定的,即dp[i][j] = dp[i + 1][j - 1]
    • 初始化:数组内容都是false
    • 递推顺序:在递推公式可以必现数组中某一个位置值是由左下方元素推导出来的,所以遍历顺序是有一个方向上倒序推导过来的
class Solution {
public:
    int countSubstrings(string s) {
        int len = s.size(), result = 0;
        std::vector<std::vector<bool>> dp(len, std::vector<bool>(len, false));
        for (int i = len - 1; i >= 0; --i) {
            for (int j = i; j < len; ++j) {
                if (s[i] == s[j]) {
                    if (j - i <= 1) {
                        dp[i][j] = true;
                        ++result;
                    } else if (dp[i + 1][j - 1]) {
                        dp[i][j] = true;
                        ++result;
                    }
                }
            }
        }
        return result;
    }
};
  • 代码神奇,思路神奇,解法神奇,三奇
  • 汇总
;