 GeeksforGeeks App
Open App Browser
Continue

# Generate an alternate increasing and decreasing Array

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

 ``

Output:

`0 4 1 3 2`

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

My Personal Notes arrow_drop_up