Aby znaleźć wszystkie powtarzające się podciągi w danym ciągu
Ponownie natrafiam na pytanie wywiadu: Aby znaleźć wszystkie powtarzające się podciągi w danym ciągu o minimalnym rozmiarze 2. Algorytm powinien być skuteczny.
Kod dla powyższego pytania jest podany poniżej, ale nie jest skuteczny.
<code>#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")); } </code>
Moje pytanie brzmi: czy istnieje jakakolwiek struktura danych, która może zaimplementować powyższe pytanie w złożoności czasowej O (N)?
Jeśli odpowiedź brzmi drzewo przyrostkowe lub haszowanie, proszę je rozwinąć.