个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助
🍓希望我们一起努力、成长,共同进步。
重点放前面:虽然动态规划并不是本题目的最优解法,但是如果动态规划的方法能够将所有子串是否是回文的信息保存在dp表
中。因此也能为其它回文串问题提供一些思路。所以大家一定要好好重视本题目。
目录
1️⃣题目描述
给定一个字符串 s
,请计算这个字符串中有多少个回文子字符串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例1:
输入:s = "abc"
输出:3
解释:三个回文子串: "a", "b", "c"
示例2:
输入:s = "abc"
输出:3
解释:三个回文子串: "a", "b", "c"
注意:
1 <= s.length <= 1000
s 由小写英文字母组成
2️⃣题目解析
状态表示:
dp[i][j]
:表示子串[i,j]是否是回文串
状态转移方程:
dp[i][j] = i + 1 < j ? dp[i + 1][j - 1] : true
填表顺序:
根据状态转移方程可以知道填表顺序应该是
从下到上、从左到右。
3️⃣解题代码
cpp
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;
}
};
最后就是通过啦!!!