Dada una cadena, ¿cómo la dividimos en el menor número posible de palíndromos de manera eficiente?

Permítanme dar una solución con O (n ^ 2) complejidad de tiempo y O (n ^ 2) complejidad de espacio.

Paso 1: construya la matriz P [] [] donde P [i] [j] = verdadero si S [i] .. S [j] es palíndromo, de lo contrario es falso.

Usar programación dinámica
P [i] [j] = P [i + 1] [j-1] && (S [i] == S [j])

Caso base
P [i] [i] = verdadero
P [i] [i + 1] = verdadero si (S [i] == S [i + 1])

Toma O (n ^ 2) tiempo y O (n ^ 2) espacio

Paso 2: use la matriz construida en el Paso 1 para encontrar el número mínimo de divisiones.
MinCuts [i] es el número mínimo de divisiones de subcadenas palindrómicas para S [i] .. S [n-1]
(n = longitud de la cadena)

Usar programación dinámica
Inicializar MinCuts [i] = ni

MinCuts [i] = mínimo (MinCuts [i], MinCuts [j] +1 {for j = i + 1 to n}) si P [i] [j-1] == verdadero / * Iterar i desde n-1 a 0 * /

La lógica es si P [i] [j-1] == verdadero, es decir S [i] .. S [j-1] es palíndromo, entonces hay 1 división para la parte S [i] .. S [j-1] y MinCuts [j] se divide para S [j] .. S [n-1]

Caso base
MinCuts [n] = 0

Este paso toma O (n ^ 2) tiempo y O (n) espacio

Al final de esto, el número mínimo de divisiones está en MinCuts [0]

Nota: para una cadena de longitud 1 (n = 1),

MinCuts [1] = 0 (caso base)

MinCuts [0] = 1 – 0 = 1 (inicialización)

MinCuts [0] sigue siendo 1 como

MinCuts [0] = mínimo (MinCuts [0], MinCuts [1] +1) / * P [0] [0] == verdadero * /
= mínimo (1, 1)
= 1
Entonces, el resultado es correcto.

Suponiendo que conozca el algoritmo para verificar el palíndromo.
Haga 1 bucle externo que cuente de 1 a n, siendo n el número de letras en la palabra.
Luego, encuentre el subconjunto de números i en el bucle y verifique si los dos conjuntos de cada sub palabra encontrada son palíndromos, si es así, imprima las palabras, de lo contrario, siga buscando más palabras para otros valores de i

More Interesting

¿Puedo escribir código en mi computadora portátil en lugar de una pizarra durante una entrevista de trabajo? ¿Qué tal proyectado en una pantalla para que todos en la sala puedan verlo? ¿Por qué perder el tiempo en una habilidad irrelevante como codificar en pizarras blancas?

Seré entrevistado para una empresa de seguridad de software de inicio. Tengo experiencia en Java y un reclutador me pidió que mejorara mis habilidades técnicas. Además de seguir el geeksforgeeks.org común, ¿de qué otra manera debo prepararme?

¿Qué debo saber sobre C ++ antes de poder escribir 'competente en C ++' en mi currículum?

Se le proporciona una matriz A de k valores que contienen valores int en orden ordenado (asec). Encuentre los valores de k superiores (asec) que pueden ser el número de la matriz A, o la suma de dos números de A o la suma de tres números de A.?

¿Cuál es el algoritmo más eficiente para encontrar el patrón en las cadenas en un conjunto de caracteres pequeños?

¿Cómo es la entrevista en persona en Google?

Cómo mejorar la codificación si soy experto en algoritmos

¿Cómo es estar en una entrevista técnica?

¿Cuáles son algunos proyectos que se pueden hacer para mejorar mi cartera de proyectos junto con mi currículum?

Cómo descifrar entrevista técnica de MNC

¿Cuál fue la mejor experiencia de entrevista que has tenido?

¿Las empresas realizan un seguimiento de los entrevistados anteriores?

Si descifras la entrevista de Google por pura suerte de obtener solo preguntas fáciles, ¿qué pasará contigo a la larga? ¿Eventualmente prosperarás o te las arreglarás?

Cómo responder paso a paso las preguntas de la entrevista de diseño de su sistema

Cómo calcular de manera óptima la carga máxima en cada paso de tiempo, dada una lista de procesos y cargas asociadas