思路:
我对动态规划的理解,就是暴力搜索,只不过是动态规划的暴搜是减少了一些重复的暴搜,因此加速了!
正常的暴搜就是3个for,一个控制起始的i,控制末尾的j,然后另外一个for是判断是否回文
这里我们动态规划的优化做法就是第3个for有重复的搜索工作,因此每次保存重复的搜索结果。
dp[i][j]表示字符串s中的下标i到j这段
动态规划判断子串是否回文的思路:
因为两重for的vector可以记住所有的搜索结果,然后我这个代码tg2是表示沿着副对角线搜索延伸,第二层for是沿着主对角线搜索延伸
ctrl变量控制搜索的边界
vector<int> v(sz+1+1,0);
vector<vector<int>> vv(sz+1+1,v);
vector的初始化写的很抽象是因为我在本地c++IDE里面没有问题,但是提交到leetcode里面说是越界了,然后直接扩大了vector大小就没有报错了
下面是完整代码
class Solution {
public:
int countSubstrings(string s) {
int sz=s.size()-1;
vector<int> v(sz+1+1,0);
vector<vector<int>> vv(sz+1+1,v);
int ctrl=0;
int cnt=sz+1;
for(int i=0;i<=sz;++i){
vv[i][i]=1;
}
int y,x;
int tg2;
for(tg2=sz;tg2>=0;--tg2){
y=0;
x=1+ctrl;
for(;y<=sz-ctrl;){
if(abs(y-x)==1||abs(y-x)==2){
vv[y][x]=(s[y]==s[x]);
}else {
vv[y][x]=vv[y+1][x-1]&(s[y]==s[x]);
}
if(vv[y][x]==1){
cnt++;
}
++x;
++y;
}
ctrl++;
}
return cnt;
}
};