
思路:
(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;
}
};
文章介绍了两种方法来寻找字符串中的回文子串。第一种方法是通过中心扩散的方式,时间复杂度为O(n^2),空间复杂度为O(1)。第二种方法,Manacher算法,显著提高了效率,达到O(n)的时间复杂度,同时空间复杂度也是O(n)。文章强调了如何处理奇数和偶数长度回文中心的统一,并提供了具体的代码实现。
2120

被折叠的 条评论
为什么被折叠?



