回文子串
- 字符串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;
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++){
int left = i/2;
int right = left+i%2;
while(left>=0 && right<n && s[left]==s[right]){
ans++;
left--;
right++;
}
}
return ans;
}
};