Recién encuentro una pregunta de la entrevista: Para encontrar toda la subcadena repetitiva en una cadena dada con un tamaño mínimo de 2. El algoritmo debe ser eficiente.Para encontrar toda la subcadena que se repite en una cadena dada
El código para la pregunta anterior se proporciona a continuación, pero no es eficiente.
#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"));
}
Mi pregunta es que, ¿hay alguna estructura de datos que se pueden aplicar pregunta anterior en el tiempo complejidad de O (N)?
Si su respuesta es Árbol de sufijo o Hashing, por favor, ejecútelo.
Si entiendo correctamente, considera dos subcadenas (de igual tamaño) diferentes en la salida, si sus índices de inicio son diferentes, no si su contenido es diferente, ¿no? – Skiminok
Lea sobre los árboles sufijo, en mi opinión, wiki es un buen comienzo aquí: http: //en.wikipedia.org/wiki/Suffix_tree – dexametason
@dexametason Usted está sugiriendo la mejor solución posible. La repetición de sub-cadenas es un problema muy común en CS. ¿Puedes publicar esto como una solución? Será muy útil para los visitantes del sitio web. ¡Aclamaciones! –