题目地址:
https://leetcode.com/problems/distinct-echo-substrings/
给定一个长 n n n的字符串 s s s,问有多少个不同子串 t t t使得存在某个非空字符串 a a a使得 t = a + a t=a+a t=a+a。
暴力枚举子串,然后用字符串哈希来判断即可。代码如下:
class Solution {
public:
using ULL = unsigned long long;
ULL P = 131;
int distinctEchoSubstrings(string s) {
int n = s.size();
s = " " + s;
vector<ULL> h(n + 1), pow(n + 1);
pow[0] = 1;
for (int i = 1; i <= n; i++) {
pow[i] = pow[i - 1] * P;
h[i] = h[i - 1] * P + s[i];
}
unordered_set<ULL> set;
// 先枚举左端点,再枚举长度
for (int i = 1; i <= n; i++)
for (int j = 1; i + j * 2 - 1 <= n; j++) {
ULL left = get(i, i + j - 1, h, pow),
right = get(i + j, i + 2 * j - 1, h, pow);
if (left == right) set.insert(left);
}
return set.size();
}
ULL get(int l, int r, vector<ULL>& h, vector<ULL>& pow) {
return h[r] - h[l - 1] * pow[r - l + 1];
}
};
时间复杂度 O ( n 2 ) O(n^2) O(n2),空间 O ( n ) O(n) O(n)。