leetocde647.回文子串

思路:
我对动态规划的理解,就是暴力搜索,只不过是动态规划的暴搜是减少了一些重复的暴搜,因此加速了!
正常的暴搜就是3个for,一个控制起始的i,控制末尾的j,然后另外一个for是判断是否回文
这里我们动态规划的优化做法就是第3个for有重复的搜索工作,因此每次保存重复的搜索结果。
dp[i][j]表示字符串s中的下标i到j这段
动态规划判断子串是否回文的思路:
s[i][j]=1,回文,i==j
s[i][j]=s[i]==s[j],当i+1==j或者i+2==j
s[i][j]=s[i+1][j-1]&(s[i]==s[j]),i+2<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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dareu_4523

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值