He estado pensando en este problema por un tiempo, y solo puedo encontrar una solución recursiva, pero siento que hay una forma de programación dinámica para hacerlo, simplemente no puedo resolverlo. ¿Es este un problema famoso que no conozco?
P: Dada una cadena y un patrón, devuelve el número de formas únicas de hacer coincidir las letras del patrón (en orden) con la cadena.
Aclaración: para encontrar una coincidencia, toma el primer carácter del patrón, busca el primer carácter coincidente en la cadena, luego toma el segundo carácter del patrón y coincide con el primer carácter coincidente de la cadena que es DESPUÉS de su coincidencia anterior personaje.
Ejemplo 1 (4 coincidencias):
Cadena: DABBCDDE
Patrón: ABD
Formas posibles (los caracteres en negrita son donde el patrón coincide con la cadena):
- D AB BC D DE
- D A B B C D DE
- D AB BCD D E
- D A B B CD D E
Ejemplo 2 (0 coincidencias):
Cadena: ABC
Patrón: BCA
(Coincides con B, C y luego estás al final de la cadena, NO puedes volver atrás y unir caracteres anteriores)
Con el enfoque recursivo, tengo un método que realiza un seguimiento de qué índice estoy en la cadena ( sIndex ), así como el patrón ( pIndex ). Si la cadena [sIndex] coincide con el patrón [pIndex], llamamos al método nuevamente y aumentamos sIndex y pIndex. Si no, simplemente aumente sIndex e intente nuevamente encontrar una coincidencia. El método devuelve el número total porque el valor de retorno de las llamadas recursivas se suman. (Las coincidencias agregan 1, ninguna coincidencia agrega 0)
Casos base:
Si pIndex es mayor que la longitud del patrón, devuelve 0.
Si sIndex es mayor que la longitud de la cadena, devuelve 1 (¡encontramos una coincidencia!)
¿Qué otras soluciones hay?
inserting
bastante engañoso. ¿No están estos elementos coincidentes pattern
con elementos string
en orden de todas las formas posibles?