Sean S [1 … N] y T [1 … N] las dos cadenas. Defina la cuenta [i] [j] como la diferencia entre el número de ocurrencias del carácter j en S [1 … i] y T [1 … i]. Es fácil ver que [l … r] es una ventana válida iff count [l-1] [j] = count [r] [j] para todo j. Si se ha calculado el recuento [i] [j] para todos los j, el recuento [i + 1] [k] se puede calcular en el tiempo O (1) ya que solo los valores para el recuento [i] [S [i]] y el recuento [i] [T [i]] necesita ser actualizado. Una vez que se ha calculado el recuento [i] [*], encuentre la i ‘más temprana para la cual recuento [i’] [*] = recuento [i] [*]. [i ‘+ 1 … i] es la ventana válida más larga con i como el elemento correcto. Repitiendo este paso para todo lo que da la solución requerida.
El almacenamiento de todos los valores de recuento [i] [*] que se han visto hasta ahora puede hacerse con hashing o con alguna estructura de datos como un conjunto. Para este problema en particular, la clasificación también funcionaría. La complejidad general sería O (N) u O (NK) u O (NK log N) (donde K es el tamaño del alfabeto) dependiendo de la implementación exacta.
- Cómo resolver el problema de los módems (SPOJ.com - Problema EC_MODE) en SPOJ
- ¿Cómo entrenan algunas aplicaciones los algoritmos de aprendizaje automático en tiempo real en su teléfono?
- ¿Cuál es el significado de matriz redimensionable en arraylist?
- ¿Es normal tener un título en CS y no ser capaz de implementar algoritmos simples?
- ¿Cuáles son los mejores algoritmos y estructuras de datos MOOC?