647. 回文子串

173 阅读2分钟

题目描述

给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

题解

计算有多少个回文子串最简单的方法就是枚举出所有回文子串。而枚举出所有回文子串有两种方法:

  1. 枚举出所有的子串,然后判断是否是回文串
  2. 枚举每一个可能的回文中心,用两个指针分别向两边拓展,相等的话就是回文串,不相等就不是,此时停止拓展。

对于第一种方法,由于判断是否为回文串时间复杂度为O(n),所以利用第一种方法解题的时间复杂度为O(n^3)。

下面具体说第二种方法,回文中心有两种,一种是只有一个,另一种是两个回文中心,两种中心找出来的和才是总的回文数。要找回文中心,那么对于长度为n的序列,即数组[0,n-1],如果n为偶数,那么回文中心有两个,一个为l=(n-1)/2,另一个为r=n/2,即(n-1+1)/2,(由于下标是从0开始)。此时r==l+1;如果n为奇数,那么回文中心有一个,l=(n-1)/2,r=n/2,并且l==r;要遍历所有的回文中心,l的范围为[0,n-1],r的范围是[0,n-1],根据上面得出l和r的公式,如果用i来遍历,那么i=2l+1或者i=2r,那么i的范围就是[0,2n-1],即i=0;i<2n。

代码

class Solution {
public:
    int countSubstrings(string s) {
        int ans=0;
        int l,r;
        int n=s.length();
        for(int i=0;i<2*n;++i){
            int l=i>>1,r=(i+1)>>1;
            while(l>=0&&r<n&&s[l--]==s[r++])
                ++ans;
        }
        return ans;
    }

};

题目链接(leetcode-cn.com/problems/pa…)