前言
……还是一个学生,做题解只是个人记录,代码有不少错误或纰漏之处,还望多多包涵。
题目描述
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 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