Técnicas para Algoritmos: Sliding Windows #2
Dada una cadena(st) y un patrón(pt), averigüe si la cadena contiene alguna permutación del patrón.
Detalles:
Si una cadena tiene 'n' caracteres distintos, tendrá n! Permutaciones. Del ejemplo anterior podemos decir que una cadena de 3 caracteres tiene un total de 3! = 3 *2*1 = 6 permutaciones.
La permutación se define como la reorganización de los caracteres de la cadena. Por ejemplo, "abc" tiene las siguientes seis permutaciones:
abc
acb
bac
bca
cab
cba
Escenarios de prueba:
Escenario #1:
Entrada: st="oidbcaf", pt="abc" (Strings).
Salida: true (Boolean).
Explicación: La cadena contiene "bca", que es una permutación del patrón dado.
Escenario #2:
Entrada: st="odicf", pt="dc" (Strings).
Salida: false (Boolean).
Explicación: No hay permutación del patrón presente en la cadena dada como una subcadena..
Escenario #3:
Entrada: st="bcdxabcdy", pt="bcdyabcdx" (Strings).
Salida: true (Boolean).
Explicación:Tanto la cadena como el patrón son una permutación el uno del otro.
Escenario #4:
Entrada: st="aaac", pt="abc" (Strings).
Salida: false (Boolean).
Explicación:No posee el st los caracteres necesarios para ser una permutación de pt.
Estrategia de solución:
Creación del objeto ptSet:
Creación del countMatch:
Condición de fin, si esta condición llega a cumplirse quiere decir que permutación existe:
Creación del objeto frecuenciaCharPt a partir del string pt, esto nos permite tener una tabla hash con cada caráter y su frecuencia:
Las variables start y end nos permiten llevar el tamaño de nuestra ventana (window) imaginaria, estas dos variables son índices de caracteres en el string st. Para poder tener comparaciones con los caracteres usamos las variables endChar y startChar.
El índice end sirve para aumentar el tamaño de nuestra ventana mientras crece su valor empezando en 0 hasta el tamaño máximo st. Por otra parte el índice start reduce el tamaño de la ventana mientras aumenta de valor, solo debe incrementar su valor cuando la window length sea mayor al tamaño de pt.
El Sliding Window de este problema tiene tres partes principales que son:
Código completo de la solución:
Big Oh del algoritmo:
Se puede notar que es un algoritmo O(m+n), donde tenemos que m es la cantidad de caracteres de st y n la cantidad de caracteres en pt. Posee dos ciclos que no están anidados. En definitiva la O(n) lo representa para resumir.
Realizar pruebas del algoritmo usando los escenarios:
El objetivo de esta parte es que el estudiante ejecute el algoritmo según los escenarios de pruebas que presentamos al inicio. La depuración del algoritmo paso a paso es vital para entender la estrategia que se utilizó en el mismo.
Código en Github, podrás encontrar otros algoritmos y sus soluciones. Si te sirve de ayuda deja una estrella para el repositorio.
Comentarios
Publicar un comentario