Skip to content
Related Articles

Related Articles

Generate an alternate increasing and decreasing Array
  • Difficulty Level : Expert
  • Last Updated : 04 Aug, 2020

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 sattisfing 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[0] == “I” therfore arr[0] < arr[1] 
str[1] == “D” therfore arr[1] > arr[2] 
str[2] == “I” therfore arr[2] < arr[3] 
str[3] == “D” therfore 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
Output: 
0 4 1 3 2

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

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up
Recommended Articles
Page :