Generate an alternate increasing and decreasing Array

• Difficulty Level : Medium
• Last Updated : 25 Aug, 2021

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
Explaination:
str == “I” therefore arr < arr
str == “D” therefore arr > arr
str == “I” therefore arr < arr
str == “D” therefore arr > arr

Input: str = “III”
Output: 0 1 2 3

Approach:

1. Initialize variable START as 0 and END as N.
2. Iterate over the entire array.
3. If str[i] == “I”  then assign START at arr[i] and Increment the START.
4. If str[i] == “D” then assign END at arr[i] and Decrement the END.
5. 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 using namespace std; // Function that returns generated arrayint* 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 Programint 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 arrayclass GFG{ // Function that returns generated arraystatic 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 codepublic 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 arraydef DiStirngMatch(Str):     N = len(Str)     # Dynamically allocate array    arr = (N + 1) *      # 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 codeif __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 arrayusing System; class GFG{ // Function that returns generated arraystatic 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 codepublic 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


Output:
0 4 1 3 2

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

My Personal Notes arrow_drop_up