¿Cuántos caracteres deben eliminarse para que la cadena S sea un palíndromo?
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:
}