题目
题目来源:leetcode 647:回文子串
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
例:
输入:“abc”
输出: 3
解释: 三个回文子串: “a”, “b”, “c”
输入:“aaa”
输出: 6
解释: 6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”
解题思路
通常遇到子串或子序列问题时,会先想到动态规划,依次以每个元素为子串或子序列的起点或结尾,从子问题出发求解原问题。
但对于该题,要以每个元素或每两个元素为回文子串的中心,然后层层向外,统计回文子串的总个数。以abba
为例:
(1)以第一个a
为中心的回文子串是"a"
。
(2)以第一个a
和第一个b
为中心的回文子串不存在。
(3)以第一个b
为中心的回文子串是"b"
。
(4)以第一个b
和第二个b
为中心的回文子串是"bb"
和"abba"
(5)以第二个b
为中心的回文子串是"b"
。
(6)以第二个b
和第二个a
为中心的回文子串不存在。
(7)以第二个a
为中心的回文子串是"a"
。
最终结果返回6
.
代码实现(C++)
class Solution {
public:
int countSubstrings(string s) {
int ans = 0;
int n = s.size();
for (int i = 0; i < n; ++i) {
ans += solve(s, i, i);
ans += solve(s, i, i + 1);
}
return ans;
}
int solve(string &s, int begin, int end) {
int n = s.size();
int ans = 0;
while (begin >= 0 && end < n && s[begin] == s[end]) {
++ans;
--begin;
++end;
}
return ans;
}
};