Pasos mínimos para eliminar una string después de la eliminación repetida de substrings de palíndromo

Dada una string que contiene caracteres solo como números enteros. Necesitamos eliminar todos los caracteres de esta string en un número mínimo de pasos, en un paso podemos eliminar la substring que es un palíndromo. Después de eliminar una substring, las partes restantes se concatenan. 
 

Ejemplos:

Input : s = “2553432”
Output : 2
We can delete all character of above string in
2 steps, first deleting the substring s[3, 5] “343”  
and then remaining string completely  s[0, 3] “2552”

Input : s = “1234”
Output : 4
We can delete all character of above string in 4 
steps only because each character need to be deleted 
separately. No substring of length 2 is a palindrome 
in above string.

Podemos resolver este problema utilizando la programación dinámica. Sea dp[i][j] el número de pasos necesarios para eliminar la substring s[i, j]. Cada carácter se eliminará solo o como parte de alguna substring, por lo que en el primer caso eliminaremos el carácter en sí y llamaremos al subproblema (i+1, j). En el segundo caso, iteraremos la ocurrencia general del carácter actual en el lado derecho, si K es el índice de una de esas ocurrencias, el problema se reducirá a dos subproblemas (i+1, K – 1) y (K+ 1, j). Podemos llegar a este subproblema (i+1, K-1) porque simplemente podemos eliminar el mismo carácter y solicitar la substring intermedia. Necesitamos ocuparnos de un caso en el que los dos primeros caracteres son iguales, en ese caso podemos reducirlo directamente al subproblema (i+2, j).
Entonces, después de la discusión anterior de la relación entre los subproblemas, podemos escribir la relación dp de la siguiente manera, 

dp[i][j] = min(1 + dp[i+1][j],
          dp[i+1][K-1] + dp[K+1][j],  where s[i] == s[K]
          1 + dp[i+2][j] )

La complejidad temporal total de la solución anterior es O(n^3) 
 

C++

//  C++ program to find minimum step to delete a string
#include <bits/stdc++.h>
using namespace std;
 
/* method returns minimum step for deleting the string,
   where in one step a palindrome is removed */
int minStepToDeleteString(string str)
{
    int N = str.length();
 
    //  declare dp array and initialize it with 0s
    int dp[N + 1][N + 1];
    for (int i = 0; i <= N; i++)
        for (int j = 0; j <= N; j++)
            dp[i][j] = 0;
 
    // loop for substring length we are considering
    for (int len = 1; len <= N; len++)
    {
        // loop with two variables i and j, denoting
        // starting and ending of substrings
        for (int i = 0, j = len - 1; j < N; i++, j++)
        {
            // If substring length is 1, then 1 step
            // will be needed
            if (len == 1)
                dp[i][j] = 1;
            else
            {
                // delete the ith char individually
                // and assign result for subproblem (i+1,j)
                dp[i][j] = 1 + dp[i + 1][j];
 
                // if current and next char are same,
                // choose min from current and subproblem
                // (i+2,j)
                if (str[i] == str[i + 1])
                    dp[i][j] = min(1 + dp[i + 2][j], dp[i][j]);
 
                /*  loop over all right characters and suppose
                    Kth char is same as ith character then
                    choose minimum from current and two
                    substring after ignoring ith and Kth char */
                for (int K = i + 2; K <= j; K++)
                    if (str[i] == str[K])
                        dp[i][j] = min(dp[i+1][K-1] + dp[K+1][j],
                                                       dp[i][j]);
            }
        }
    }
 
    /* Uncomment below snippet to print actual dp tablex
    for (int i = 0; i < N; i++, cout << endl)
        for (int j = 0; j < N; j++)
            cout << dp[i][j] << " ";    */
 
    return dp[0][N - 1];
}
 
//  Driver code to test above methods
int main()
{
    string str = "2553432";
    cout << minStepToDeleteString(str) << endl;
    return 0;
}

Java

// Java program to find minimum step to
// delete a string
public class GFG
{                           
    /* method returns minimum step for deleting
       the string, where in one step a
       palindrome is removed
     */
    static int minStepToDeleteString(String str) {
        int N = str.length();
 
        // declare dp array and initialize it with 0s
        int[][] dp = new int[N + 1][N + 1];
        for (int i = 0; i <= N; i++)
            for (int j = 0; j <= N; j++)
                dp[i][j] = 0;
 
        // loop for substring length we are considering
        for (int len = 1; len <= N; len++) {
             
            // loop with two variables i and j, denoting
            // starting and ending of substrings
            for (int i = 0, j = len - 1; j < N; i++, j++) {
     
                // If substring length is 1, then 1 step
                // will be needed
                if (len == 1)
                    dp[i][j] = 1;
                     
                else {
                    // delete the ith char individually
                    // and assign result for
                    // subproblem (i+1,j)
                    dp[i][j] = 1 + dp[i + 1][j];
 
                    // if current and next char are same,
                    // choose min from current and
                    // subproblem (i+2, j)
                    if (str.charAt(i) == str.charAt(i + 1))
                        dp[i][j] = Math.min(1 + dp[i + 2][j],
                                               dp[i][j]);
 
                    /* loop over all right characters and
                      suppose Kth char is same as ith
                      character then choose minimum from
                      current and two substring after
                      ignoring ith and Kth char
                     */
                    for (int K = i + 2; K <= j; K++)
                        if (str.charAt(i) == str.charAt(K))
                            dp[i][j] = Math.min(
                                         dp[i + 1][K - 1] +
                                        dp[K + 1][j], dp[i][j]);
                }
            }
        }
 
        /* Uncomment below snippet to print actual dp tablex
          
           for (int i = 0; i < N; i++){
           System.out.println();
           for (int j = 0; j < N; j++)
           System.out.print(dp[i][j] + " ");
           }
            */
             
        return dp[0][N - 1];
    }
 
    // Driver code to test above methods
    public static void main(String args[]) {
        String str = "2553432";
        System.out.println(minStepToDeleteString(str));
    }
}
// This code is contributed by Sumit Ghosh

Python 3

# Python 3 program to find minimum
# step to delete a string
 
# method returns minimum step for
# deleting the string, where in one
# step a palindrome is removed
def minStepToDeleteString(str):
 
    N = len(str)
 
    # declare dp array and initialize
    # it with 0s
    dp = [[0 for x in range(N + 1)]
             for y in range(N + 1)]
 
    # loop for substring length
    # we are considering
    for l in range(1, N + 1):
         
        # loop with two variables i and j, denoting
        # starting and ending of substrings
        i = 0
        j = l - 1
        while j < N:
         
            # If substring length is 1,
            # then 1 step will be needed
            if (l == 1):
                dp[i][j] = 1
            else:
             
                # delete the ith char individually
                # and assign result for subproblem (i+1,j)
                dp[i][j] = 1 + dp[i + 1][j]
 
                # if current and next char are
                # same, choose min from current
                # and subproblem (i+2,j)
                if (str[i] == str[i + 1]):
                    dp[i][j] = min(1 + dp[i + 2][j], dp[i][j])
 
                ''' loop over all right characters and suppose
                    Kth char is same as ith character then
                    choose minimum from current and two
                    substring after ignoring ith and Kth char '''
                for K in range(i + 2, j + 1):
                    if (str[i] == str[K]):
                        dp[i][j] = min(dp[i + 1][K - 1] +
                                       dp[K + 1][j], dp[i][j])
                         
            i += 1
            j += 1
 
    # Uncomment below snippet to print
    # actual dp tablex
    # for (int i = 0; i < N; i++, cout << endl)
    # for (int j = 0; j < N; j++)
    #     cout << dp[i][j] << " ";
 
    return dp[0][N - 1]
 
# Driver Code
if __name__ == "__main__":
    str = "2553432"
    print( minStepToDeleteString(str))
 
# This code is contributed by ChitraNayal

C#

// C# program to find minimum step to
// delete a string
using System;
 
class GFG {   
     
    /* method returns minimum step for deleting
    the string, where in one step a
    palindrome is removed */
    static int minStepToDeleteString(string str)
    {
        int N = str.Length;
 
        // declare dp array and initialize it
        // with 0s
        int [,]dp = new int[N + 1,N + 1];
         
        for (int i = 0; i <= N; i++)
            for (int j = 0; j <= N; j++)
                dp[i,j] = 0;
 
        // loop for substring length we are
        // considering
        for (int len = 1; len <= N; len++) {
             
            // loop with two variables i and j,
            // denoting starting and ending of
            // substrings
            for (int i = 0, j = len - 1; j < N; i++, j++)
            {
     
                // If substring length is 1, then 1
                // step will be needed
                if (len == 1)
                    dp[i,j] = 1;
                     
                else
                {
                    // delete the ith char individually
                    // and assign result for
                    // subproblem (i+1,j)
                    dp[i,j] = 1 + dp[i + 1,j];
 
                    // if current and next char are same,
                    // choose min from current and
                    // subproblem (i+2, j)
                    if (str[i] == str[i + 1])
                        dp[i,j] = Math.Min(1 + dp[i + 2,j],
                                                  dp[i,j]);
 
                    /* loop over all right characters and
                    suppose Kth char is same as ith
                    character then choose minimum from
                    current and two substring after
                    ignoring ith and Kth char
                    */
                    for (int K = i + 2; K <= j; K++)
                        if (str[i] == str[K])
                            dp[i,j] = Math.Min(
                                        dp[i + 1,K - 1] +
                                     dp[K + 1,j], dp[i,j]);
                }
            }
        }
 
        /* Uncomment below snippet to print actual dp tablex
         
        for (int i = 0; i < N; i++){
        System.out.println();
        for (int j = 0; j < N; j++)
        System.out.print(dp[i][j] + " ");
        } */
             
        return dp[0,N - 1];
    }
 
    // Driver code to test above methods
    public static void Main()
    {
        string str = "2553432";
        Console.Write(minStepToDeleteString(str));
    }
}
 
// This code is contributed by nitin mittal

PHP

<?php
// PHP program to find minimum step
// to delete a string
 
// method returns minimum step for
// deleting the string, where in one
// step a palindrome is removed */
function minStepToDeleteString($str)
{
    $N = strlen($str);
 
    // declare dp array and initialize
    // it with 0s
    $dp[$N + 1][$N + 1] = array(array());
    for ($i = 0; $i <= $N; $i++)
        for ($j = 0; $j <= $N; $j++)
            $dp[$i][$j] = 0;
 
    // loop for substring length we
    // are considering
    for ($len = 1; $len <= $N; $len++)
    {
        // loop with two variables i and j, denoting
        // starting and ending of substrings
        for ($i = 0, $j = $len - 1;
                     $j < $N; $i++, $j++)
        {
            // If substring length is 1, then
            // 1 step will be needed
            if ($len == 1)
                $dp[$i][$j] = 1;
            else
            {
                // delete the ith char individually
                // and assign result for subproblem (i+1,j)
                $dp[$i][$j] = 1 + $dp[$i + 1][$j];
 
                // if current and next char are same,
                // choose min from current and subproblem
                // (i+2,j)
                if ($str[$i] == $str[$i + 1])
                    $dp[$i][$j] = min(1 + $dp[$i + 2][$j],
                                          $dp[$i][$j]);
 
                /* loop over all right characters and suppose
                    Kth char is same as ith character then
                    choose minimum from current and two
                    substring after ignoring ith and Kth char */
                for ($K = $i + 2; $K <= $j; $K++)
                    if ($str[$i] == $str[$K])
                        $dp[$i][$j] = min($dp[$i + 1][$K - 1] +
                                          $dp[$K + 1][$j],
                                          $dp[$i][$j]);
            }
        }
    }
 
    /* Uncomment below snippet to print actual dp tablex
    for (int i = 0; i < N; i++, cout << endl)
        for (int j = 0; j < N; j++)
            cout << dp[i][j] << " "; */
 
    return $dp[0][$N - 1];
}
 
// Driver code
$str = "2553432";
echo minStepToDeleteString($str), "\n";
 
// This code is contributed by ajit.
?>

Javascript

<script>
// Java Script program to find minimum step to
// delete a string
 
    /* method returns minimum step for deleting
       the string, where in one step a
       palindrome is removed
     */
    function minStepToDeleteString(str)
    {
        let N = str.length;
   
        // declare dp array and initialize it with 0s
        let dp = new Array(N + 1);
        for (let i = 0; i <= N; i++)
        {
            dp[i]=new Array(N+1);
            for (let j = 0; j <= N; j++)
                dp[i][j] = 0;
          }
        // loop for substring length we are considering
        for (let len = 1; len <= N; len++) {
               
            // loop with two variables i and j, denoting
            // starting and ending of substrings
            for (let i = 0, j = len - 1; j < N; i++, j++) {
       
                // If substring length is 1, then 1 step
                // will be needed
                if (len == 1)
                    dp[i][j] = 1;
                       
                else {
                    // delete the ith char individually
                    // and assign result for
                    // subproblem (i+1,j)
                    dp[i][j] = 1 + dp[i + 1][j];
   
                    // if current and next char are same,
                    // choose min from current and
                    // subproblem (i+2, j)
                    if (str[i] == str[i+1])
                        dp[i][j] = Math.min(1 + dp[i + 2][j],
                                               dp[i][j]);
   
                    /* loop over all right characters and
                      suppose Kth char is same as ith
                      character then choose minimum from
                      current and two substring after
                      ignoring ith and Kth char
                     */
                    for (let K = i + 2; K <= j; K++)
                        if (str[i] == str[K])
                            dp[i][j] = Math.min(
                                         dp[i + 1][K - 1] +
                                        dp[K + 1][j], dp[i][j]);
                }
            }
        }
   
        /* Uncomment below snippet to print actual dp tablex
            
           for (int i = 0; i < N; i++){
           System.out.println();
           for (int j = 0; j < N; j++)
           System.out.print(dp[i][j] + " ");
           }
            */
               
        return dp[0][N - 1];
    }
     
    // Driver code to test above methods
    let str = "2553432";
    document.write(minStepToDeleteString(str));
     
    // This code is contributed by avanitrachhadiya2155
</script>

Producción: 

2

Complejidad temporal : O(n 2
Espacio auxiliar : O(n 2 )

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *