Recuento de distintas strings posibles después de realizar operaciones dadas

Dada una string numérica S que consta de solo tres tipos de caracteres 0, 1 y 2 inicialmente y después de dos operaciones:  

  • La ocurrencia de dos 1 consecutivos puede ser reemplazada por 3.
  • La ocurrencia de dos 2 consecutivos puede ser reemplazada por 4.

La tarea dada es encontrar el número total de strings diferentes que se pueden formar usando las operaciones.
Ejemplos: 
 

Entrada: S = “0110000022” 
Salida:
Explicación: 
Puede haber cuatro formas diferentes usando las operaciones, las cuatro strings son 
“0110000022”, “030000022”, “03000004”, “011000004”
Entrada: S = “111” 
Salida :
 

Enfoque: 
Para resolver este problema, estamos utilizando un enfoque de programación dinámica. Definimos un arreglo dp para almacenar el conteo de posibles strings de longitud igual a sus respectivos índices. 

  • Inicializar dp[0] = dp[1] = 1.
  • Para cualquier índice i entre [1, N-1] , si el carácter en ese índice es ‘1’ o ‘2’ y es igual al de su índice anterior, agregue las posibles strings que se pueden formar de longitud i-1 y i-2 . De lo contrario, es el mismo que el de la longitud i-1 .

dp[i + 1] = dp[i] + dp[i-1] si S[i] == S[i-1] donde S[i] es ‘1’ o ‘2’. 
dp[i + 1] = dp[i] en caso contrario. 
 

  • Retorna dp[n] como el conteo de diferentes strings posibles.

A continuación se muestra la implementación del enfoque anterior:
 

C++

// C++ implementation of
// the above approach
#include
using namespace std;
 
// Function that prints the
// number of different strings
// that can be formed
void differentStrings(string s)
{
    // Computing the length of
    // the given string
    int n = s.length();
 
    vector dp(n + 1);
 
    // Base case
    dp[0] = dp[1] = 1;
 
    // Traverse the given string
    for (int i = 1; i < n; i++) {
 
        // If two consecutive 1's
        // or 2's are present
        if (s[i] == s[i - 1]
            && (s[i] == '1'
                || s[i] == '2'))
 
            dp[i + 1]
                = dp[i] + dp[i - 1];
 
        // Otherwise take
        // the previous value
        else
            dp[i + 1] = dp[i];
    }
 
    cout << dp[n] << "\n";
}
 
// Driver Code
int main()
{
    string S = "0111022110";
 
    differentStrings(S);
 
    return 0;
}

C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void differentStrings(char* s)
{
   
    // Computing the length of
    // the given string
    int n = strlen(s);
 
    int dp[n + 1];
 
    // Base case
    dp[0] = dp[1] = 1;
 
    // Traverse the given string
    for (int i = 1; i < n; i++) {
 
        // If two consecutive 1's
        // or 2's are present
        if (s[i] == s[i - 1]
            && (s[i] == '1'
                || s[i] == '2'))
 
            dp[i + 1]  = dp[i] + dp[i - 1];
 
        // Otherwise take
        // the previous value
        else
            dp[i + 1] = dp[i];
    }
 
    printf("%d\n", dp[n]);
}
 
// Driver Code
int main()
{
    char S[] = "0111022110";
 
    differentStrings(S);
 
    return 0;
}
 
// This code is contributed by phalashi.

Java

// Java implementation of the above approach
import java.io.*;
 
class GFG{
 
// Function that prints the
// number of different strings
// that can be formed
static void differentStrings(String s)
{
     
    // Computing the length of
    // the given string
    int n = s.length();
 
    int[] dp = new int[n + 1];
 
    // Base case
    dp[0] = dp[1] = 1;
 
    // Traverse the given string
    for(int i = 1; i < n; i++)
    {
        
       // If two consecutive 1's
       // or 2's are present
       if (s.charAt(i) == s.charAt(i - 1) &&
          (s.charAt(i) == '1' ||
           s.charAt(i) == '2'))
           dp[i + 1] = dp[i] + dp[i - 1];
            
       // Otherwise take the
       // previous value
       else
           dp[i + 1] = dp[i];
    }
    System.out.println(dp[n]);
}
 
// Driver code
public static void main(String[] args)
{
    String S = "0111022110";
 
    differentStrings(S);
}
}
 
// This code is contributed by offbeat

Python3

# Python3 implementation of
# the above approach
 
# Function that prints the
# number of different strings
# that can be formed
def differentStrings(s):
 
    # Computing the length of
    # the given string
    n = len(s)
 
    dp = [0] * (n + 1)
 
    # Base case
    dp[0] = dp[1] = 1
 
    # Traverse the given string
    for i in range (1, n):
 
        # If two consecutive 1's
        # or 2's are present
        if (s[i] == s[i - 1] and
           (s[i] == '1' or
            s[i] == '2')):
 
            dp[i + 1] = dp[i] + dp[i - 1]
 
        # Otherwise take
        # the previous value
        else:
            dp[i + 1] = dp[i]
    
    print (dp[n])
 
# Driver Code
if __name__ == "__main__": 
    S = "0111022110"
    differentStrings(S)
     
# This code is contributed by Chitranayal

C#

// C# implementation of the above approach
using System;
class GFG{
 
// Function that prints the
// number of different strings
// that can be formed
static void differentStrings(string s)
{
     
    // Computing the length of
    // the given string
    int n = s.Length;
 
    int[] dp = new int[n + 1];
 
    // Base case
    dp[0] = dp[1] = 1;
 
    // Traverse the given string
    for(int i = 1; i < n; i++)
    {
 
       // If two consecutive 1's
       // or 2's are present
       if (s[i] == s[i - 1] &&
          (s[i] == '1' ||
           s[i] == '2'))
           dp[i + 1] = dp[i] + dp[i - 1];
        
       // Otherwise take the
       // previous value
       else
           dp[i + 1] = dp[i];
    }
    Console.Write(dp[n]);
}
 
// Driver code
public static void Main()
{
    string S = "0111022110";
 
    differentStrings(S);
}
}
 
// This code is contributed by Code_Mech

Javascript

<script>
 
// JavaScript implementation of
// the above approach
 
// Function that prints the
// number of different strings
// that can be formed
function differentStrings(s)
{
    // Computing the length of
    // the given string
    var n = s.length;
 
    var dp = Array(n + 1);
 
    // Base case
    dp[0] = dp[1] = 1;
 
    // Traverse the given string
    for (var i = 1; i < n; i++) {
 
        // If two consecutive 1's
        // or 2's are present
        if (s[i] == s[i - 1]
            && (s[i] == '1'
                || s[i] == '2'))
 
            dp[i + 1]
                = dp[i] + dp[i - 1];
 
        // Otherwise take
        // the previous value
        else
            dp[i + 1] = dp[i];
    }
 
    document.write( dp[n] + "<br>");
}
 
// Driver Code
var S = "0111022110";
differentStrings(S);
 
 
</script>
Producción: 

12

 

Complejidad de tiempo: O (N), ya que estamos usando un bucle para atravesar N veces, por lo que nos costará O (N) tiempo 
Espacio auxiliar: O (N), ya que estamos usando espacio adicional para la array DP.

Publicación traducida automáticamente

Artículo escrito por nitinkr8991 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 *