
- 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;
}
};