LeetCode647:回文子串

题目链接:647. 回文子串 - 力扣(LeetCode)

代码如下:

class Solution {
public:
    int countSubstrings(string s) {
        vector<vector<bool>> dp(s.size() + 1, vector<bool>(s.size() + 1, false));
        int result = 0;
        for(int i = s.size() - 1; i >= 0; i--)
        {
            for(int j = i; j < s.size(); j++)
            {
                if(s[i] == s[j])
                {
                    if(j - i <= 1)
                    {
                        dp[i][j] = true;
                        result++;
                    }
                    else if(dp[i + 1][j - 1] == true)
                    {
                        dp[i][j] = true;
                        result++;
                    }
                }
            }
        }

        return result;
    }
};

dp的含义:[i, j]这个区间是否是回文子串

dp的递推公式:

if(s[i] == s[j])
{
           if(j - i <= 1)
           {
                   dp[i][j] = true;
                    result++;
            }
           else if(dp[i + 1][j - 1] == true)
           {
                   dp[i][j] = true;
                    result++;
            }

}

这个就是先判断s[i] == s[j]如果相等的话,看看是不是j-i<=1,其实你好好想想,既然s[i] == s[j],分成两个情况,第一个是j-i<=1这个情况了。如果相等的话,那就算一个,如果不是的话,那就看看是不是[i + 1, j - 1]这个区间里面是否回文字符串,如果是的话,那么就让result++,为什么呢?因为你既然都s[i] == s[j]了,而且[i + 1, j - 1]这个区间还是会问,那么[i , j]肯定也是会问的。

初始化:这个需要画一个2*2,来看这个需要怎样初始化,通过画一个2*2表格,来看dp[i - 1][j - 1]能通过哪个方向推导出来,然后分析,只需要都初始化为false即可。

遍历顺序:这个也是先画一个2*2的表格,然后发现,这个只能由下到上,由左到右,那么这个由下到上,这个时候就需要从后往前遍历了,如果从前往后遍历,那么你最后一个值你求不出来。

返回值:返回值的话就是我们在题目中所给的result,返回这个值即可。
 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值