题目描述
知识点
动态规划
结果
实现
码前思考
- 模板题,先枚举长度,再枚举起点;
dp[i][j]
表示i~j
是否为回文子串。
代码实现
//由于字符串的长度不超过1000,那么可以使用动态规划O(n^2)来求解,当然暴力好像也行?
class Solution {
public:
int countSubstrings(string s) {
int len = s.size();
if(len == 0){
return 0;
}
vector<vector<bool>> dp(len,vector<bool>(len,false));
int cnt = 0;
//dp套路操作:初始化
for(int i=0;i<len;i++){
dp[i][i] = true;
cnt++;
}
for(int i=0;i<len-1;i++){
if(s[i] == s[i+1]){
dp[i][i+1] = true;
cnt++;
}
}
//接下来枚举所有的长度
for(int l=3;l<=len;l++){
for(int i=0;i<=len-l;i++){
int j = i+l-1;
if(s[i] == s[j]){
if(dp[i+1][j-1]){
dp[i][j]=true;
cnt++;
}
}else{
dp[i][j] = false;
}
}
}
return cnt;
}
};
码后反思
- nice~模板题让人盲目自信。
二刷反思
cnt
用于计数,计数的方法比较特殊,是通过遍历长度来计算的!每次增加的是某个长度的回文串的数量~