Count of subsequences of length 4 in form (x, x, x+1, x+1) | Set 2 - GeeksforGeeks

27 Apr, 2021
Given a large number in form of string str of size N, the task is to count the subsequence of length 4 whose digit are in the form of (x, x, x+1, x+1).Example:
Input: str = “1515732322” Output: 3 Explanation: For the given input string str = “1515732322”, there are 3 subsequence {1122}, {1122}, and {1122} which are in the given form of (x, x, x+1, x+1).
Input: str = “224353” Output: 1 Explanation: For the given input string str = “224353”, there is only 1 subsequence possible {2233} in the given form of (x, x, x+1, x+1).
Prefix Sum Approach: Please refer to the Set 1, for the Prefix sum approach.
Dynamic Programming Approach: This problem can be solved using Dynamic Programming. We will be using 2 arrays as count1[][j] and count2[][10] such that count1[i][10] will store the count of consecutive equal element of digit j at current index i traversing string from left and count2[i][j] will store the count of consecutive equal element of digit j at current index i traversing string from right. Below are the steps:
Initialize two count array count1[][10] for filling table from left to right and count2[][10] for filling table from right to left of input string.
Traverse input string and fill the both count1 and count2 array.
Recurrence Relation for count1[][] is given by:
count1[i][j] += count1[i – 1][j] where count1[i][j] is the count of two adjacent at index i for digit j
Recurrence Relation for count2[][] is given by:
 count2[i][j] += count1[i + 1][j] where count2[i][j] is the count of two adjacent at index i for digit j
Initialize a variable ans to 0 that stores the resultant count of stable numbers.
Traverse the input string and get the count of numbers from count1[][] and count2[][] array such that the difference between number from count1[][] and count2[][] array is 1 and store it in variable c1 and c2.
Finally update result(say ans) with (c1 * ((c2 * (c2 – 1) / 2))).
Print the answer ans calculated above.
Below is the implementation of the above approach:
C++
Java
Python3
C#
Javascript
// C++ program for the above approach#include <bits/stdc++.h>using namespace std; // Function to count the numbersint countStableNum(string str, int N){    // Array that stores the    // digits from left to right    int count1[N][10];     // Array that stores the    // digits from right to left    int count2[N][10];     // Initially both array store zero    for (int i = 0; i < N; i++)        for (int j = 0; j < 10; j++)            count1[i][j] = count2[i][j] = 0;     // Fill the table for count1 array    for (int i = 0; i < N; i++) {        if (i != 0) {            for (int j = 0; j < 10; j++) {                count1[i][j] += count1[i - 1][j];            }        }         // Update the count of current character        count1[i][str[i] - '0']++;    }     // Fill the table for count2 array    for (int i = N - 1; i >= 0; i--) {        if (i != N - 1) {            for (int j = 0; j < 10; j++) {                count2[i][j] += count2[i + 1][j];            }        }         // Update the count of cuuent character        count2[i][str[i] - '0']++;    }     // Variable that stores the    // count of the numbers    int ans = 0;     // Traverse Input string and get the    // count of digits from count1 and    // count2 array such that difference    // b/w digit is 1 & store it int c1 &c2.    // And store it in variable c1 and c2    for (int i = 1; i < N - 1; i++) {         if (str[i] == '9')            continue;         int c1 = count1[i - 1][str[i] - '0'];        int c2 = count2[i + 1][str[i] - '0' + 1];         if (c2 == 0)            continue;         // Update the ans        ans = (ans               + (c1 * ((c2 * (c2 - 1) / 2))));    }     // Return the final count    return ans;} // Driver Codeint main(){    // Given String    string str = "224353";    int N = str.length();     // Function Call    cout << countStableNum(str, N);     return 0;}
// Java program for the above approachimport java.io.*; class GFG{ // Function to count the numbersstatic int countStableNum(String str, int N){         // Array that stores the    // digits from left to right    int count1[][] = new int[N][10];         // Array that stores the    // digits from right to left    int count2[][] = new int[N][10];         // Initially both array store zero    for(int i = 0; i < N; i++)        for(int j = 0; j < 10; j++)            count1[i][j] = count2[i][j] = 0;         // Fill the table for count1 array    for(int i = 0; i < N; i++)    {        if (i != 0)        {            for(int j = 0; j < 10; j++)            {                count1[i][j] += count1[i - 1][j];            }        }           // Update the count of current character        count1[i][str.charAt(i) - '0']++;    }       // Fill the table for count2 array    for(int i = N - 1; i >= 0; i--)    {        if (i != N - 1)        {            for(int j = 0; j < 10; j++)            {                count2[i][j] += count2[i + 1][j];            }        }                 // Update the count of cuuent character        count2[i][str.charAt(i) - '0']++;    }         // Variable that stores the    // count of the numbers    int ans = 0;         // Traverse Input string and get the    // count of digits from count1 and    // count2 array such that difference    // b/w digit is 1 & store it int c1 &c2.    // And store it in variable c1 and c2    for(int i = 1; i < N - 1; i++)    {        if (str.charAt(i) == '9')        continue;                 int c1 = count1[i - 1][str.charAt(i) - '0'];        int c2 = count2[i + 1][str.charAt(i) - '0' + 1];                 if (c2 == 0)        continue;                 // Update the ans        ans = (ans + (c1 * ((c2 * (c2 - 1) / 2))));    }         // Return the final count    return ans;} // Driver codepublic static void main(String[] args){         // Given String    String str = "224353";    int N = str.length();         // Function call    System.out.println(countStableNum(str, N));}} // This code is contributed by Pratima Pandey
# Python3 program for the above approach # Function to count the numbersdef countStableNum(Str, N):     # Array that stores the    # digits from left to right    count1 =  [[0 for j in range(10)]                  for i in range(N)]       # Array that stores the    # digits from right to left    count2 =  [[0 for j in range(10)]                  for i in range(N)]       # Initially both array store zero    for i in range(N):        for j in range(10):            count1[i][j], count2[i][j] = 0, 0       # Fill the table for count1 array    for i in range(N):        if (i != 0):            for j in range(10):                count1[i][j] = (count1[i][j] +                                count1[i - 1][j])                       # Update the count of current character        count1[i][ord(Str[i]) - ord('0')] += 1         # Fill the table for count2 array    for i in range(N - 1, -1, -1):        if (i != N - 1):            for j in range(10):                 count2[i][j] += count2[i + 1][j]           # Update the count of cuuent character        count2[i][ord(Str[i]) -                  ord('0')] = count2[i][ord(Str[i]) -                                        ord('0')] + 1       # Variable that stores the    # count of the numbers    ans = 0       # Traverse Input string and get the    # count of digits from count1 and    # count2 array such that difference    # b/w digit is 1 & store it int c1 &c2.    # And store it in variable c1 and c2    for i in range(1, N - 1):        if (Str[i] == '9'):            continue           c1 = count1[i - 1][ord(Str[i]) - ord('0')]        c2 = count2[i + 1][ord(Str[i]) - ord('0') + 1]           if (c2 == 0):            continue           # Update the ans        ans = (ans + (c1 * ((c2 * (c2 - 1) // 2))))       # Return the final count    return ans     # Driver code # Given StringStr = "224353"N = len(Str) # Function callprint(countStableNum(Str, N)) # This code is contributed by divyeshrabadiya07
// C# program for the above approachusing System; class GFG{ // Function to count the numbersstatic int countStableNum(String str, int N){         // Array that stores the    // digits from left to right    int [,]count1 = new int[N, 10];         // Array that stores the    // digits from right to left    int [,]count2 = new int[N, 10];         // Initially both array store zero    for(int i = 0; i < N; i++)        for(int j = 0; j < 10; j++)            count1[i, j] = count2[i, j] = 0;         // Fill the table for count1 array    for(int i = 0; i < N; i++)    {        if (i != 0)        {            for(int j = 0; j < 10; j++)            {                count1[i, j] += count1[i - 1, j];            }        }         // Update the count of current character        count1[i, str[i] - '0']++;    }     // Fill the table for count2 array    for(int i = N - 1; i >= 0; i--)    {        if (i != N - 1)        {            for(int j = 0; j < 10; j++)            {                count2[i, j] += count2[i + 1, j];            }        }                 // Update the count of cuuent character        count2[i, str[i] - '0']++;    }         // Variable that stores the    // count of the numbers    int ans = 0;         // Traverse Input string and get the    // count of digits from count1 and    // count2 array such that difference    // b/w digit is 1 & store it int c1 &c2.    // And store it in variable c1 and c2    for(int i = 1; i < N - 1; i++)    {        if (str[i] == '9')        continue;                 int c1 = count1[i - 1, str[i] - '0'];        int c2 = count2[i + 1, str[i] - '0' + 1];                 if (c2 == 0)        continue;                 // Update the ans        ans = (ans + (c1 * ((c2 * (c2 - 1) / 2))));    }         // Return the readonly count    return ans;} // Driver codepublic static void Main(String[] args){         // Given String    String str = "224353";    int N = str.Length;         // Function call    Console.WriteLine(countStableNum(str, N));}} // This code is contributed by Amit Katiyar
<script> // Javascript program for the above approach // Function to count the numbersfunction countStableNum(str, N){    // Array that stores the    // digits from left to right    var count1 = Array.from(Array(N), ()=>Array(10));     // Array that stores the    // digits from right to left    var count2 = Array.from(Array(N), ()=>Array(10));     // Initially both array store zero    for (var i = 0; i < N; i++)        for (var j = 0; j < 10; j++)            count1[i][j] = count2[i][j] = 0;     // Fill the table for count1 array    for (var i = 0; i < N; i++) {        if (i != 0) {            for (var j = 0; j < 10; j++) {                count1[i][j] += count1[i - 1][j];            }        }         // Update the count of current character        count1[i][str[i] - '0']++;    }     // Fill the table for count2 array    for (var i = N - 1; i >= 0; i--) {        if (i != N - 1) {            for (var j = 0; j < 10; j++) {                count2[i][j] += count2[i + 1][j];            }        }         // Update the count of cuuent character        count2[i][str[i] - '0']++;    }     // Variable that stores the    // count of the numbers    var ans = 0;     // Traverse Input string and get the    // count of digits from count1 and    // count2 array such that difference    // b/w digit is 1 & store it var c1 &c2.    // And store it in variable c1 and c2    for (var i = 1; i < N - 1; i++) {         if (str[i] == '9')            continue;         var c1 = count1[i - 1][str[i] - '0'];        var c2 = count2[i + 1][str[i] - '0' + 1];         if (c2 == 0)            continue;         // Update the ans        ans = (ans               + (c1 * ((c2 * (c2 - 1) / 2))));    }     // Return the final count    return ans;} // Driver Code // Given Stringvar str = "224353";var N = str.length; // Function Calldocument.write( countStableNum(str, N)); </script>
1
Time Complexity: O(N) Auxiliary Space Complexity: O(N) 
dewantipandeydp
amit143katiyar
divyeshrabadiya07
khushboogoyal499
rrrtnx
number-digits
number-theory
subsequence
Algorithms
Competitive Programming
Dynamic Programming
Mathematical
Strings
number-theory
Strings
Dynamic Programming
Mathematical
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
DSA Sheet by Love Babbar
Quadratic Probing in Hashing
K means Clustering - Introduction
SCAN (Elevator) Disk Scheduling Algorithms
Difference between Informed and Uninformed Search in AI
Practice for cracking any coding interview
Arrow operator -> in C/C++ with Examples
Competitive Programming - A Complete Guide
Modulo 10^9+7 (1000000007)
Prefix Sum Array - Implementation and Applications in Competitive Programming