LeetCode第647题:回文子串题解(C++)

这篇博客详细解析了LeetCode第647题——回文子串的解题思路和C++实现。作者首先介绍了题目要求,然后逐步分析并优化了三次算法,从最初的超时方案到最终的空间和时间效率显著提升的解决方案。博客探讨了如何避免不必要的子串创建和循环,以提高性能。
摘要由CSDN通过智能技术生成

前言

……还是一个学生,做题解只是个人记录,代码有不少错误或纰漏之处,还望多多包涵。

题目描述

给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

示例 1:
输入:“abc”
输出:3
解释:三个回文子串: “a”, “b”, “c”

示例 2:
输入:“aaa”
输出:6
解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”

提示:
输入的字符串长度不会超过 1000 。

题解

第一次分析

先把任务分成三步。
第一步,把字符串s中所有需要检测的子串保存下来放入一个vector中。
第二步,取vector中的数据进行检测,若符合回文子串的定义,则放入第二个vector中。
第三步,返回第二个vector的大小。
对于第一步,我们需要想清楚,如何才能得到所有需要检测的子串?
对于符号串"abc",我们可以得到的所有子串为"a",“b”,“c”,“ab”,“bc”,“abc”,这样看的话,似乎很难从代码角度穷举所有的子串。
别急,我们换个思路来看,可以将子串看成这样的集合:
"a",“ab”,“abc”,“b”,“bc”,"c"
看出规律来了吧,我们只需要两个循环就可以穷举所有需要检测的子串。
来到第二步,如何才能检测一个符号串是否是回文子串呢?
这个还是比较简单的。定义前后两个索引,分别往中间靠拢,如果两个索引的值出现不相等的情况,即不是回文子串;否则,直到前索引大于后索引,即表示已经检测完这个字符串了,那么该子串就是回文子串了。
不多说了,上代码:

class Solution {
   
public:
    int countSubstrings(string s) {
   
        using size_t = decltype(s.size());
        vector<string> vec, vec2; //定义两个容器
	    size_t size = s.size();
	    if (size == 0)
		    return 0;
        for (size_t i = 0; i < size; ++i) //第一步,穷举所有子串
        {
   
            for (size_t j = i; j < size; ++j)
            {
   
                vec.push_back(s.substr(i, j 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值