Open In App

Count of distinct possible strings after performing given operations

Given a numeric string S consisting of only three types of characters 0, 1, and 2 initially and following two operations:  

The given task is to find the total number of different strings that can be formed by using the operations.
Examples: 
 



Input: S = “0110000022” 
Output:
Explanation: 
There can be four different formed by using the operations, the four strings are 
“0110000022”, “030000022”, “03000004”, “011000004”
Input: S = “111” 
Output:
 

Approach: 
In order to solve this problem, we are using a dynamic programming approach. We define an array dp to store the count of possible strings of length equal to its respective indices. 



dp[i + 1] = dp[i] + dp[i-1] if S[i] == S[i-1] where S[i] is either ‘1’ or ‘2’. 
dp[i + 1] = dp[i] otherwise. 
 

Below is the implementation of the above approach:
 




// 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;
}




#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 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 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# 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




<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>

Output
12


Time Complexity: O(N), as we are using a loop to traverse N times so it will cost us O(N) time 
Auxiliary Space: O(N), as we are using extra space for DP array.

Efficient approach : Space optimization O(1)

In previous approach we the current value dp[i] is only depend upon the previous 2 values i.e. dp[i-1] and dp[i+1]. So to optimize the space we can keep track of previous and next values by the help of three variables prev and next which will reduce the space complexity from O(N) to O(1).  

Implementation Steps:

Implementation:




#include <iostream>
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();
 
    // Base case
    int prev = 1, curr = 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')) {
            int next = prev + curr;
            prev = curr;
            curr = next;
        }
 
        // Otherwise take
        // the previous value
        else {
            prev = curr;
        }
    }
 
    cout << curr << "\n";
}
 
// Driver Code
int main()
{
    string S = "0111022110";
 
    differentStrings(S);
 
    return 0;
}




import java.util.*;
 
public class Main {
 
  // Utility function to find the number of different strings
  // that can be formed
  public static void differentStrings(String s)
  {
     
    // Computing the length of the given string
    int n = s.length();
 
    // Base case
    int prev = 1, curr = 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')) {
        int next = prev + curr;
        prev = curr;
        curr = next;
      }
 
      // Otherwise take the previous value
      else {
        prev = curr;
      }
    }
 
    System.out.println(curr);
  }
 
  // Driver Code
  public static void main(String[] args) {
    String S = "0111022110";
 
    differentStrings(S);
  }
}




def different_strings(s: str) -> None:
    # Computing the length of the given string
    n = len(s)
 
    # Base case
    prev, curr = 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'):
            next = prev + curr
            prev = curr
            curr = next
 
        # Otherwise take the previous value
        else:
            prev = curr
 
    print(curr)
 
# Driver Code
if __name__ == '__main__':
    S = "0111022110"
    different_strings(S)




using System;
 
public class Program
{
    // Utility function to find the number of different strings
    // that can be formed
    public static void DifferentStrings(string s)
    {
        // Computing the length of the given string
        int n = s.Length;
 
        // Base case
        int prev = 1, curr = 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'))
            {
                int next = prev + curr;
                prev = curr;
                curr = next;
            }
            // Otherwise take the previous value
            else
            {
                prev = curr;
            }
        }
 
        Console.WriteLine(curr);
    }
 
    // Entry point
    public static void Main(string[] args)
    {
        string S = "0111022110";
 
        DifferentStrings(S);
    }
}
 
// This code is contributed by Dwaipayan Bandyopadhyay




// Function that prints the
// number of different strings
// that can be formed
function differentStrings(s) {
    // Computing the length of
    // the given string
    const n = s.length;
 
    // Base case
    let prev = 1, curr = 1;
 
    // Traverse the given string
    for (let 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')) {
            const next = prev + curr;
            prev = curr;
            curr = next;
        } else {
            // Otherwise take
            // the previous value
            prev = curr;
        }
    }
 
    console.log(curr);
}
 
// Driver Code
const S = "0111022110";
 
differentStrings(S);

Output: 

12

 

Time Complexity: O(N), as we are using a loop to traverse N times so it will cost us O(N) time 
Auxiliary Space: O(1)


Article Tags :