Day31

昨晚弄简历结果一不小心睡晚了,导致今天一整天都及其堕落,北京瘫了一天,但是作为一个有原则的人,觉得无论如何都得做起码一道题,结果又过了0点,也就只做了1道题。。。(′д` )…彡…彡

已知一个字符串,求该字符串中有多少组回文子串(每个字符本身就是一个回文子串)

思路:这道题效率最低的做法是人都知道——两层大循环逐一比较,所以在测试一组超长的字符串时超时了( ╯□╰ )
答案中的聪明人们表示一层大循环加一层小循环就够了。这里一个重要的关键点就是:回文字符串本身是对称的,所以从两头同时向回文字符串中心点缩小得到的子串也必然是回文字符串。
所以在每趟比较中设置一个中心点center,然后设置center的左left和右right标志位依次向字符串两头比较。

int CountPalindromicSubString(string s)
{
    if(s == null)
    {
        return 0;
    }
    int result = s.Length;
    //从0.5开始记且步长为0.5是因为当回文字符串长度为偶数和奇数的时候中心点的下标为不存在和存在两种情况,偶数个时就是挨着的两个数开始向左右检查,奇数个时就是中心点左右的两个数开始向左右检查
    for(float center = 0.5f; center < s.Length; center += 0.5f)
    {
        int left = (int)(center - 0.5f);
        int right = (int)(center + 1f);
        while(left >= 0 && right < s.Length && s[left] == s[right])
        {
            result++;
            left--;
            right++;
        }
    }
    return result;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值