给你一个字符串s,考虑其所有重复子串c++
时间: 2024-11-13 12:27:11 浏览: 7
Leetcode无重复字符的最长子串_leetcode_C++_direct8eo_最长重复子串_
5星 · 资源好评率100%
给定一个字符串 `s`,在 C++ 中找到所有重复子串(即长度大于 1 的子串,且在原串中至少出现两次)可以采用滑动窗口算法以及哈希集合来解决。以下是基本的步骤:
1. **设置两个指针**:设左指针 `left` 和右指针 `right`,初始都指向字符串的第二个字符。
2. **创建哈希集合**:使用 `std::unordered_set` 或 `std::set` 来存储子串,因为子串是无序的,哈希集合能快速判断是否存在。
3. **滑动窗口**:
- 当 `right` 指向的子串首次出现时,将其添加到哈希集合中。
- 检查当前子串是否已经在集合中:如果在,说明找到了一个重复子串。计算起始位置并记录下来。
- 更新右边界:将右指针向右移动一位。
- 如果不在集合中,继续移动右边界,直到再次遇到该子串为止。
4. **遍历完整个字符串**:当右指针到达字符串末尾,左指针不变,更新右指针继续上述过程。
5. **输出结果**:收集到的所有重复子串作为结果返回。
```cpp
#include <string>
#include <unordered_set>
#include <vector>
std::vector<std::string> findDuplicateSubstrings(const std::string& s) {
int n = s.size();
std::vector<std::string> result;
std::unordered_set<std::string> substrings;
for (int left = 1; left < n; ++left) {
for (int right = left + 1; right <= n; ++right) {
std::string substring = s.substr(left, right - left);
if (substrings.find(substring) != substrings.end()) {
result.push_back(substring);
} else {
substrings.insert(substring);
}
}
}
return result;
}
```
阅读全文