用C++求字符串的子串个数(不重叠)
时间: 2024-02-02 19:03:46 浏览: 132
可以使用双重循环枚举所有的子串,再用一个标记数组记录已经出现过的子串,最后统计未出现过的子串的个数即可。
以下是示例代码:
```c++
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 1005;
int main() {
char s[MAXN];
cin >> s;
int n = strlen(s);
bool vis[MAXN][MAXN] = {false};
for (int len = 1; len <= n; len++) { // 枚举子串长度
for (int i = 0; i + len - 1 < n; i++) { // 枚举子串起始位置
int j = i + len - 1; // 子串结束位置
for (int k = i; k <= j; k++) { // 枚举子串中的每个字符
if (vis[i][j]) break; // 如果该子串已经出现过,跳过
vis[i][j] |= vis[i][k] & vis[k + 1][j]; // 判断是否重叠
}
if (!vis[i][j]) vis[i][j] = true; // 如果该子串未出现过,标记为已出现
}
}
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
if (vis[i][j]) ans++;
}
}
cout << ans << endl;
return 0;
}
```
注意,上述代码的时间复杂度为 $O(n^3)$,可能会超时,需要根据具体情况进行优化。
阅读全文