剑指 Offer II 020. 回文子字符串的个数

文章介绍了两种方法来寻找字符串中的回文子串。第一种方法是通过中心扩散的方式,时间复杂度为O(n^2),空间复杂度为O(1)。第二种方法,Manacher算法,显著提高了效率,达到O(n)的时间复杂度,同时空间复杂度也是O(n)。文章强调了如何处理奇数和偶数长度回文中心的统一,并提供了具体的代码实现。
摘要由CSDN通过智能技术生成

在这里插入图片描述
思路:
(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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值