私は最近インタビューの質問に出くわしました: 最小サイズ 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) の時間複雑度で実装できるデータ構造はありますか?
あなたの答えがサフィックスツリーまたはハッシュである場合は、詳しく説明してください。