Red de conocimiento informático - Aprendizaje de código fuente - ¿Cuántos caracteres deben eliminarse para que la cadena S sea un palíndromo?

¿Cuántos caracteres deben eliminarse para que la cadena S sea un palíndromo?

Ingrese una cadena y descubra la cantidad mínima de caracteres que deben eliminarse para que la cadena S sea una cadena palíndromo. Por ejemplo, si ingresa "cabebaf" y elimina "c", la cadena después de "f" se convertirá en "abeba". De esta manera, después de eliminar al menos dos cadenas, la cadena original se convertirá en una cadena palíndromo. (PD: esta es la primera vez que escribo un artículo. Si hay alguna descripción poco clara, hágamelo saber).

Análisis del tema:

Declaración de variable: deje que la cadena de entrada sea S y la longitud es len, la cadena se convierte en una matriz de caracteres, el tipo de tabla es Ch, el tipo de tabla es S(i, J), el subíndice Ch es de I a J (0 <= I lt; j ltLen ), la cadena de tabla f (i, j) S (i, j) debe eliminarse al menos cuando se convierta en una cadena palíndromo. El resultado es el número mínimo de caracteres eliminados necesarios para la cadena.

Descripción del principio: 1: si la longitud de la cadena len es 1, no es necesario eliminar ningún carácter y se devuelve 0; si la longitud de la cadena len es 2, se devuelve 0 (igual) o 1 (diferente); );

2. Si len gt1, si necesita encontrar el número mínimo de caracteres eliminados f (i, j 1) de la subcadena S (i, j 1), hay dos situaciones: <. /p>

1): Si Ch[j i] == Ch[i] (es decir, los dos caracteres antes y después de la cadena son iguales), entonces f(i, j 1) = f(i 1 , j) (igual que eliminar s (i) , j 65438

2): si Ch[j i]! = Ch[i] (es decir, los dos caracteres antes y después de la cadena son diferentes), entonces f(i, j 1) = min( f(i, j), f (i 1, j 1)) 1;

3. Según el análisis de 2, si se requiere que la subcadena S (i, j 1) con longitud de cadena j-i 1 tenga f (i, j 1), solo necesitamos conocer la subcadena. f(i, j) y f (i 1). Del análisis de 1, ya conocemos la f de todas las subcadenas con longitudes 1 y 2. Entonces solo necesitamos encontrar todas las f con una longitud de cadena de 3 a len en secuencia.

Descripción de la implementación: 1: Solicite una matriz bidimensional resint[len][len]; Res(i, j) representa la subcadena S(j-i 1, j) de longitud I para convertirse en un palíndromo. El número de caracteres que se eliminarán de la cadena. Por lo tanto, el registro i-1 en la fila I de res es un registro no válido. (Los primeros caracteres i-1 no pueden formar una cadena de longitud I).

2. Calcule res en secuencia de acuerdo con los pasos 2 y 3 en la declaración principal y finalmente devuelva el último registro de res, que es lo que desea.

3. Debido a que al calcular res con longitud de cadena k, solo necesita conocer res con longitudes de cadena k-1 y k-2, por lo que durante el proceso de implementación, cuando solicite la matriz res Solo solicite int [3] [len] y cubra alternativamente las filas donde se encuentra k-3 durante el cálculo, lo que puede reducir en gran medida la memoria utilizada.

*Para convertir la cadena S en una cadena palíndromo, ¿cuántos caracteres deben eliminarse al menos?

*Principio: Supongamos que la cadena i-j en la tabla f(i,j) es una cadena S, entonces

* 1: Si s (i) = = s (j 1 )-> f(i,j 1)=f(i 1,j)

* 2: Si S(i)! = S(j 1)->; f(i, j 1)=Math.min(f(i, j), f(i 1, j 1)) 1

*Supongamos que la cadena S La longitud es len, construya una matriz len*len.

* @param cadena de entrada

* @Devuelve el número mínimo de eliminaciones

*/

public static int reverso(String s ){

if(s = = null | | s . length() lt; 2)

Devuelve 0

int len ​​​​= s . length( );

char[]ch = s . tochararray();

int[][]RES = new int[3][len];

for(int I = 2; i ltlen i){

int t = I 3;

for(int j = 0; j ltlen-I; j){

if(ch[j]==ch[j i])

RES[t][j I]= RES[f(t-2)][j I-1] .

Otros

RES[t][j I]= math min(RES[f(t-1)][j I-1], RES[f(t-. 1)][j I)] 1;

}

}

return RES[(len-1) 3][len-1];

}

public static int f(int n){

Return n lt0?n 3:

}