Para encontrar toda la subcadena de repetición en una cadena dada
Me he encontrado con una pregunta de entrevista: para encontrar todas las subcadenas de repetición en una cadena dada con un tamaño mínimo de 2. El algoritmo debe ser eficiente.
El código para la pregunta anterior se proporciona a continuación, pero no es eficiente.
<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>
Mi pregunta es que, ¿existe alguna estructura de datos que pueda implementar la pregunta anterior en la complejidad de tiempo de O (N)?
Si su respuesta es Árbol de sufijo o Hashing, por favor elaborela.