Open In App

Generate an alternate increasing and decreasing Array

Improve
Improve
Like Article
Like
Save
Share
Report

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:

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


Output: 

0 4 1 3 2

 

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



Last Updated : 11 Feb, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads