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

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

1. 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.
2. Traverse input string and fill the both count1 and count2 array.
3. 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

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

5. Initialize a variable ans to 0 that stores the resultant count of stable numbers.
6. Traverse the input string and get the count of numbers from count1[][] and count2[][] array such that difference between number from count1[][] and count2[][] array is 1 and store it in variable c1 and c2.
7. Finally update result(say ans) with (c1 * ((c2 * (c2 – 1) / 2))).
8. Print the answer ans calculated above.

Below is the implementation of above approach:

## C++

 `// C++ program for the above approach ` `#include ` `using` `namespace` `std; ` ` `  `// Function to count the numbers ` `int` `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 Code ` `int` `main() ` `{ ` `    ``// Given String ` `    ``string str = ``"224353"``; ` `    ``int` `N = str.length(); ` ` `  `    ``// Function Call ` `    ``cout << countStableNum(str, N); ` ` `  `    ``return` `0; ` `} `

## Java

 `// Java program for the above approach ` `import` `java.io.*; ` ` `  `class` `GFG{ ` ` `  `// Function to count the numbers ` `static` `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 code ` `public` `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 `

## C#

 `// C# program for the above approach ` `using` `System; ` ` `  `class` `GFG{ ` ` `  `// Function to count the numbers ` `static` `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 code ` `public` `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`

Output:

```1
```

Time Complexty: O(N)
Auxiliary Space Complexty: O(N)

My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

2

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.