1.利用哈希函数做到O(1) 时间内判断字符串是否相等。
然后暴力搜索所有字符串进行解题。
注意:怎么用哈希代表字符串判断这部分要仔细分析。
#define LL long long
class Solution {
public:
int mode=1e9+7;
int gethash(const vector<int>& pre,const vector<int>& mul,int l,int r){
return (pre[r+1]-(LL)pre[l]*mul[r-l+1]%mode+mode)%mode;
}
int distinctEchoSubstrings(string text) {
int n=text.size();
int base=31;
vector<int> pre(n+1),mul(n+1);
pre[0]=0,mul[0]=1;
for(int i=1;i<=n;i++){
pre[i]=((LL)pre[i-1]*base+text[i-1])%mode;
mul[i]=(LL)mul[i-1]*base%mode;
}
unordered_set<int> seen[n];
int ans=0;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
int len=j-i;
if(j+len<=n){
int hash_left=gethash(pre,mul,i,j-1);
if(!seen[len-1].count(hash_left)&&hash_left==gethash(pre,mul,j,j+len-1)){
ans++;
seen[len-1].insert(hash_left);
}
}
}
}
return ans;
}
};