Después de buscar en Internet y discutir este problema con algunos de mis amigos, he solucionado este problema. Este problema es una combinación de algoritmo KMP y DP.
Deje que x [] e y [] tengan su significado habitual de la pregunta, MAXY y MAXX sean la longitud máxima de las cadenas correspondientes. Ahora cree una coincidencia de matriz [MAXY] [26]. La explicación en la siguiente sección nos ayudará a entender por qué esta matriz es útil.
match [i] [j] almacenará la longitud máxima del sufijo de la cadena (que se construye tomando el primer carácter i de y [] y el último carácter es j), que también es un prefijo de y []
Por ejemplo, si y [] = “ababc”, haga coincidir [4] [a] = 3. Esto se debe a que si construimos una cadena a partir de los primeros 4 caracteres de y [] y agregamos “a” en el último, lo haremos obtener “ababa”. Y ahora el sufijo más largo de esta cadena que también es un prefijo de y [] es “aba”. Podemos construir esta coincidencia de matriz [MAXY] [26] llamando repetidamente computeFailureFunction (cadena S) con diferente S (= y [0..i-1] + j para diferentes i y j) cada vez. La complejidad temporal del relleno de la matriz de coincidencias es [matemática] \ matemática {O} (| Y | ^ 2) [/ matemática] .
Después de completar este paso, nuestra definición y formulación de dp se verá más o menos así.
- ¿Cuánta competencia en la estructura de datos y el algoritmo es más que suficiente para ingresar a Google / Facebook y cuál debería ser la estrategia de 4 meses para aprenderlo?
- ¿Qué nivel de matemática se requiere para el libro "Introducción a los algoritmos 3ra edición" (MIT Press)?
- ¿Qué se debe saber o hacer antes y al escribir un algoritmo?
- ¿Cuál es la explicación intuitiva de agregar bordes traseros en el gráfico en el algoritmo Ford-Fulkerson?
- ¿Cuál es el enfoque para resolver GSS1 y GSS3 en SPOJ usando árboles de segmentos?
dp [i] [j] almacenará la longitud máxima de la subsecuencia (no la subcadena, ya que es posible que tengamos que soltar algunos caracteres de x) de x [0..i] de modo que el sufijo más largo de esta cadena, que también es un prefijo de y [] es de longitud j.
Así que ahora hay dos posibilidades para cualquier carácter de x [], ya sea soltar x [i] o retenerlo.
- Si dejamos caer x [i] entonces dp [i] [j] = dp [i-1] [j]
- De lo contrario, conservamos x [i], entonces nuevamente hay dos posibilidades, ya sea el sufijo que coincide hasta ahora (sufijo de la cadena construida que también es un prefijo de y []) aumentará en 1 (x [i] == y [j]) o disminuirá (x [i]! = y [j])
- Si x [i] == y [j] y j! = Ylen-1, entonces dp [i] [j + 1] = dp [i-1] [j] + 1. Esto se debe a que x [i] coincide con y [j] para que la longitud del sufijo coincidente que también es un prefijo de y [] se incremente en 1, por lo que ahora rellenaremos dp [i] [j + 1]. Y a medida que conservamos x [i] nuestra respuesta debería aumentar en 1 que antes.
- Si x [i]! = Y [j] entonces dp [i] [coincidencia] = dp [i-1] [j] + 1. Aquí x [i] no coincide con y [j] por lo que hemos encontrado un nueva coincidencia (la coincidencia es el sufijo más largo de la cadena construida, que también es un prefijo de y []) de la cadena construida con y []. Como sabemos en el paso i-1, los caracteres j ya coinciden, es decir, y [0..j-1] == cadena incorporada [ij..i-1]. Ahora, para encontrar una nueva coincidencia más larga, tenemos que encontrar un sufijo de cadena y [0..j-1] + x [i] (= construir cadena [ij..i]) que también es un prefijo de cadena y [] , y eso es exactamente igual a coincidir [j] [x [i]] , que hemos calculado previamente.
El caso base será si x [0] == y [0] luego dp [0] [1] = 1 y dp [0] [0] = 1. Después de calcular la matriz dp, encuentre el valor máximo en la matriz dp [xlen -1]. Deje que el valor máximo sea max. Entonces nuestro ans será xlen-max . La complejidad temporal de este algoritmo es [matemática] \ matemática {O} (| X || Y | + | Y | ^ 2) [/ matemática].