Given a string str of size N containing two types of character only that are “I” or “D”. The task is to generate an array arr[0, 1, . . N] of size N + 1 satisfying the following conditions:
- If str[i] == “I” then arr[i] < arr[i+1]
- If str[i] == “D” then arr[i] > arr[i+1]
Examples:
Input: str = “IDID”
Output: 0 4 1 3 2
Explanation:
str[0] == “I” therefore arr[0] < arr[1]
str[1] == “D” therefore arr[1] > arr[2]
str[2] == “I” therefore arr[2] < arr[3]
str[3] == “D” therefore arr[3] > arr[4]Input: str = “III”
Output: 0 1 2 3
Approach:
- Initialize variable START as 0 and END as N.
- Iterate over the entire array.
- If str[i] == “I” then assign START at arr[i] and Increment the START.
- If str[i] == “D” then assign END at arr[i] and Decrement the END.
- Now the last element of the array isn’t assigned so assign START at A[N].
Below is the implementation of the approach.
C++
// C++ program to Generate an increasing // and decreasing array #include <iostream> using namespace std; // Function that returns generated array int * DiStirngMatch(string Str) { int N = Str.length(); // Dynamically allocate array int * arr = new int [N]; // START=0, END=N int START = 0, END = N; // iterate over array for ( int i = 0; i < N; i++) { // if Str[i]=='I' assign arr[i] // as START and increment START if (Str[i] == 'I' ) arr[i] = START++; // if str[i]=='D' assign arr[i] // as END and decrement END if (Str[i] == 'D' ) arr[i] = END--; } // assign A[N] as START arr[N] = START; // return starting // address of array A return arr; } // Driver Program int main() { string Str = "IDID" ; int N = Str.length(); int * ptr = DiStirngMatch(Str); for ( int i = 0; i <= N; i++) cout << ptr[i] << " " ; return 0; } |
Java
// Java program to generate an increasing // and decreasing array class GFG{ // Function that returns generated array static int []DiStirngMatch(String Str) { int N = Str.length(); // Dynamically allocate array int []arr = new int [N + 1 ]; // START=0, END=N int START = 0 , END = N; // Iterate over array for ( int i = 0 ; i < N; i++) { // if Str[i]=='I' assign arr[i] // as START and increment START if (Str.charAt(i) == 'I' ) arr[i] = START++; // if str[i]=='D' assign arr[i] // as END and decrement END if (Str.charAt(i) == 'D' ) arr[i] = END--; } // Assign A[N] as START arr[N] = START; // Return starting // address of array A return arr; } // Driver code public static void main(String[] args) { String Str = "IDID" ; int N = Str.length(); int [] ptr = DiStirngMatch(Str); for ( int i = 0 ; i <= N; i++) System.out.print(ptr[i] + " " ); } } // This code is contributed by amal kumar choubey |
Python3
# Python3 program to generate an # increasing and decreasing array # Function that returns generated array def DiStirngMatch( Str ): N = len ( Str ) # Dynamically allocate array arr = (N + 1 ) * [ 0 ] # START, END= 0 ,N START, END = 0 , N # Iterate over array for i in range (N): # If Str[i]=='I' assign arr[i] # as START and increment START if ( Str [i] = = 'I' ): arr[i] = START START + = 1 # If str[i]=='D' assign arr[i] # as END and decrement END if ( Str [i] = = 'D' ): arr[i] = END END - = 1 # Assign A[N] as START arr[N] = START # Return starting # address of array A return arr # Driver code if __name__ = = "__main__" : Str = "IDID" N = len ( Str ) ptr = DiStirngMatch( Str ) for i in range (N + 1 ): print (ptr[i], end = " " ) # This code is contributed by chitranayal |
C#
// C# program to generate an increasing // and decreasing array using System; class GFG{ // Function that returns generated array static int []DiStirngMatch(String Str) { int N = Str.Length; // Dynamically allocate array int []arr = new int [N + 1]; // START=0, END=N int START = 0, END = N; // Iterate over array for ( int i = 0; i < N; i++) { // if Str[i]=='I' assign arr[i] // as START and increment START if (Str[i] == 'I' ) arr[i] = START++; // if str[i]=='D' assign arr[i] // as END and decrement END if (Str[i] == 'D' ) arr[i] = END--; } // Assign A[N] as START arr[N] = START; // Return starting // address of array A return arr; } // Driver code public static void Main(String[] args) { String Str = "IDID" ; int N = Str.Length; int [] ptr = DiStirngMatch(Str); for ( int i = 0; i <= N; i++) Console.Write(ptr[i] + " " ); } } // This code is contributed by amal kumar choubey |
Javascript
<script> // Javascript program to Generate an increasing // and decreasing array // Function that returns generated array function DiStirngMatch( Str) { var N = Str.length; // Dynamically allocate array var arr = Array(N).fill(0); // START=0, END=N var START = 0, END = N; // iterate over array for ( var i = 0; i < N; i++) { // if Str[i]=='I' assign arr[i] // as START and increment START if (Str[i] == 'I' ) arr[i] = START++; // if str[i]=='D' assign arr[i] // as END and decrement END if (Str[i] == 'D' ) arr[i] = END--; } // assign A[N] as START arr[N] = START; // return starting // address of array A return arr; } // Driver Program var Str = "IDID" ; var N = Str.length; var ptr = DiStirngMatch(Str); for ( var i = 0; i <= N; i++) document.write( ptr[i] + " " ); // This code is contributed by itsok. </script> |
0 4 1 3 2
Time Complexity: O (N)
Auxiliary Space: O (N)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!