【代码随想录】刷题笔记Day54

时间:2024-01-24 11:46:49
  • dp数组含义
    • dp[i][j]:表示区间范围[i,j] (左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false
  • 递推公式
    • s[i]与s[j]不相等,dp[i][j] = false
    • s[i]与s[j]相等
      • 情况一:i 与 j相同,a,dp[i][j] = true
      • 情况二:i 与 j相差1,aa,dp[i][j] = true
      • 情况三:i 与 j相差大于1,例如cabac,看dp[i + 1][j - 1]是否为true
    • 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;
          }
      }
  •  初始化
    • dp[i][j] = false,遍历顺序从下到上,从左到右
  • 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;
        }
    };