查找给定字符串中的所有重复子字符串
To find all the repeating substring in a given string
我偶然遇到一个面试问题:查找给定字符串中最小大小为 2 的所有重复子字符串。算法应该是有效的算法。
下面给出了上述问题的代码,但它不是有效的代码。
#include <iostream>
#include <algorithm>
#include <iterator>
#include <set>
#include <string>
using namespace std;
int main()
{
typedef string::const_iterator iterator;
string s("ABCFABHYIFAB");
set<string> found;
if (2 < s.size())
for (iterator i = s.begin() + 1, j = s.end(); i != j; ++i)
for (iterator x = s.begin(); x != i; ++x)
{
iterator tmp = mismatch(i, j, x).second;;
if (tmp - x > 1)
found.insert(string(x, tmp));
}
copy(found.begin(), found.end(),ostream_iterator<string>(cout, "n"));
}
我的问题是,是否有任何数据结构可以及时实现上述问题O(N)的复杂性?
如果您的答案是后缀树或哈希,请详细说明。
如果分析字符串 "AAAAAAAAAAAAAA"
的输出,则其中有 O(n²) 字符,因此算法至少为 O(n²)。
要实现 O(n²),只需为 s 的每个后缀构建后缀树(索引 [1..n], [2..n], [3..n], ..., [n..n])。 如果其中一个字符串没有自己的结束节点,这并不重要,只需计算每个节点的使用频率即可。
最后,使用 count>1 遍历每个节点并打印其路径。
这只是一个疯狂的想法,但值得一试(但是,它消耗 O(N) 内存,其中 N 是主字符串的长度)。该算法不是 O(N),但也许可以优化。
这个想法是,你不想经常进行字符串比较。您可以收集读取数据的哈希值(例如,读取字符的 ASCII 代码之和)并比较哈希值。如果哈希相等,则字符串可能相等(稍后必须检查)。例如:
ABCAB
A -> (65)
B -> (131, 66)
C -> (198, 133, 67)
A -> (263, 198, 132, 65)
B -> (329, 264, 198, 131, 66)
因为您只对 2+ 长度值感兴趣,所以您必须省略最后一个值(因为它始终对应于单个字符)。
我们看到两个相等的值:131 和 198。 131 代表 AB 并显示该对,但 198 代表 ABC 和 BCA,必须通过手动检查来拒绝。
这只是想法,而不是解决方案本身。可以扩展哈希函数以考虑字符在子字符串(或序列结构)中的位置。可以更改哈希值的存储方法以提高性能(但会增加内存使用量的成本)。
希望我能帮到一点:)
后缀树如何获取所有重复的子字符串,字符串"密西西比"构建后缀树,如下所示:
对不起,我知道了。"最后,使用 count>1 遍历每个节点并打印其路径。"计数"是这个子节点的数量
tree-->|---mississippi m..mississippi
|
|---i-->|---ssi-->|---ssippi i .. ississippi
| | |
| | |---ppi issip,issipp,issippi
| |
| |---ppi ip, ipp, ippi
|
|---s-->|---si-->|---ssippi s .. ssissippi
| | |
| | |---ppi ssip, ssipp, ssippi
| |
| |---i-->|---ssippi si .. sissippi
| |
| |---ppi sip, sipp, sippi
|
|---p-->|---pi p, pp, ppi
|
|---i p, pi
--- Suffix Tree for "mississippi" ---
- 使用正则表达式regex_search在字符串中查找字符串
- 按类型与字符串查找对象
- 使用C RTTI(内置)通过字符串查找功能指针
- 关于获取行和字符串查找函数的问题
- 字符串查找方法找不到第一字母
- C++ 字符串.查找()
- 遇到字符串::查找的问题
- 将一个数组作为子字符串查找到另一个数组中
- 字符串查找第一个非的 C++ 问题
- 如何将通配符与字符串::查找一起使用
- 字符串::查找问题 (C++)
- 性能标准::strstr vs. 标准::字符串::查找
- C++字符串::查找崩溃应用程序
- 使用字符串查找单词的正确方法是什么
- 如何在<string>没有 std::string 中介的情况下制作一个支持通过 C 字符串查找的集合?
- 使用C++根据行中的第一个字符串查找行(仅一个)
- Borland字符串::查找bug
- std::map如何通过字符串查找元素
- 字符串查找函数返回奇数
- 如何使用子字符串查找数字行的正确部分