思路:
(1)统计回文中心,然后两边展开:时间复杂度o(n^2),空间复杂度o(1)
(2)Manacher 算法:时间复杂度o(n),空间复杂度o(n)
(1)如果一个回文字符串是奇数长度,则回文中心是一个数,相反是两个数,所以我们要统一奇数和偶数的情况,一个位置上的数它可能是奇数的回文中心,也可以和它的下一位数构成一个偶数回文中心,所以我们要分别对本位和本位+下一位进行讨论。每一次讨论时都是从中心开始左移和右移指针去判断是否为回文子串,所以讨论的代码时不变的。这样我们就可以写出一个函数专门去讨论是否为回文,主函数负责传送字符串和回文中心的位置。
class Solution {
public:
int countSubstrings(string s)
{
if (s.size() == 0)
return 0;
int count = 0;
for (int i = 0;i < s.size();i++)
{
count += counts(s, i, i);
count += counts(s, i, i + 1);
}
return count;
}
int counts(string s, int start, int end)
{
int count = 0;
while (start >= 0 && end < s.length() && s[start] == s[end])
{
count++;
start--;
end++;
}
return count;
}
};