Ich bin noch auf ein Interview Frage: Um alle wiederholenden Teilstring in einer gegebenen Zeichenfolge mit einer minimalen Größe von 2 zu finden. Der Algorithmus sollte effizient sein.Um alle wiederholenden Teilstrings in einer gegebenen Zeichenfolge zu finden
Code für obige Frage ist unten angegeben, aber es ist nicht effizient.
#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"));
}
Meine Frage ist, dass, gibt es eine Datenstruktur, die obige Frage in der Zeit Komplexität von O (N) umsetzen kann?
Wenn Ihre Antwort Suffix Tree oder Hashing ist, bitte erläutern Sie es.
Wenn ich richtig verstehe, betrachten Sie zwei (gleichgroße) Teilstrings unterschiedlich in der Ausgabe, wenn ihre Start-Indizes unterschiedlich sind, nicht wenn ihr Inhalt anders ist, oder? – Skiminok
Lies über Suffix-Bäume, meiner Meinung nach ist Wiki ein guter Anfang hier: http: //en.wikipedia.org/wiki/Suffix_tree – dexametason
@dexametason Sie schlagen die bestmögliche Lösung vor. Wiederholte Sub-Strings sind ein sehr häufiges Problem in CS. Kannst du das bitte als Lösung posten? Es wird sehr hilfreich für die Website-Besucher sein. Prost! –