这道题目的遍历顺序,切实体现了卡哥动规五部曲的重要性了,思路清晰。
将思路体现在代码的注释中,更加可视化。
class Solution
{
public:
int countSubstrings(string s)
{
// 1. dp[i][j] 表示从s[i]到s[j]这个子串是否为回文串,返回True/False
// 3. 初始化,全部初始化为false
vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));
int result = 0;
// 4. 遍历顺序。由递推公式可知,需要从下往上、从左到右遍历
for(int i = s.size() - 1; i >= 0; i--)
{
for(int j = i; j <= s.size() - 1; j++)
{
// 2. 递推公式
if(s[i] == s[j])
{
if(j - i <= 1)
{
dp[i][j] = true;
result++;
}
else if(dp[i+1][j-1] == true)
{
dp[i][j] = true;
result++;
}
}
}
}
return result;
}
};