LeetCode 647. 回文子串 (字符串hash、Manacher)

回文子串

  • 字符串Hash
    时间复杂度: O ( n 2 ) O(n^2) O(n2)
class Solution {
    
    
public:
    const int P = (int)1e9+7;
    int countSubstrings(string s) {
    
    
        unsigned long long h1[1010]={
    
    0},h2[1010]={
    
    0},p[1010]={
    
    1};
        int n = s.size();
        for(int i=1;i<=s.size();i++){
    
    
            h1[i] = h1[i-1]*P + (s[i-1]-'a'+1);
            h2[n-i+1] = h2[n-i+2]*P + (s[n-i]-'a'+1);
            p[i] = p[i-1]*P;
        }
        int ans = 0;
        // 枚举所有[i,j]子串,用O(1)的开销检查是否为回文串
        for(int i=1;i<=n;i++){
    
    
            for(int j=i;j<=n;j++){
    
    
                if( h1[j]-h1[i-1]*p[j-i+1] == h2[i]-h2[j+1]*p[j-i+1]){
    
    
                    ans++;
                }
            }
        }
        return ans;
    }
};
  • 中心扩散法
    时间复杂度: O ( n 2 ) O(n^2) O(n2)
class Solution {
    
    
public:
    int countSubstrings(string s) {
    
    
        int ans = 0, n = s.size();
        for(int i=0;i<2*n-1;i++){
    
    
            // i为奇数,中心位置是在字符中间;
            // i为偶数,中心位置是在字符上
            int left = i/2;
            int right = left+i%2;
            while(left>=0 && right<n && s[left]==s[right]){
    
    
                ans++;
                left--;
                right++;
            }
        }
        return ans;
    }
};
/*
0   1   2   3   4   5
0 1 2 3 4 5 6 7 8 9 10
*/

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/107351422