重点放前面:虽然动态规划并不是本题目的最优解法,但是如果动态规划的方法能够将所有子串是否是回文的信息保存在dp表
中。因此也能为其它回文串问题提供一些思路。所以大家一定要好好重视本题目。
1️⃣题目描述
给定一个字符串 s
,请计算这个字符串中有多少个回文子字符串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例1:
示例2:
注意:
1 <= s.length <= 1000
s 由小写英文字母组成
2️⃣题目解析
状态表示:
dp[i][j]
:表示子串[i,j]是否是回文串
状态转移方程:
dp[i][j] = i + 1 < j ? dp[i + 1][j - 1] : true
填表顺序:
根据状态转移方程可以知道填表顺序应该是
从下到上、从左到右。
3️⃣解题代码
class Solution {
public:
int countSubstrings(string s) {
int n = s.size(),ret = 0;
vector<vector<bool>> dp(n,vector<bool>(n));
for(int i = n - 1;i >= 0;i--)
{
for(int j = i;j < n;j++)
{
if(s[i] == s[j])
dp[i][j] = i + 1 < j ? dp[i + 1][j - 1] : true;
if(dp[i][j]) ret++;
}
}
return ret;
}
};
最后就是通过啦!!!