Generate an alternate increasing and decreasing Array
Last Updated :
11 Feb, 2022
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++
#include <iostream>
using namespace std;
int * DiStirngMatch(string Str)
{
int N = Str.length();
int * arr = new int [N];
int START = 0, END = N;
for ( int i = 0; i < N; i++) {
if (Str[i] == 'I' )
arr[i] = START++;
if (Str[i] == 'D' )
arr[i] = END--;
}
arr[N] = START;
return arr;
}
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
class GFG{
static int []DiStirngMatch(String Str)
{
int N = Str.length();
int []arr = new int [N + 1 ];
int START = 0 , END = N;
for ( int i = 0 ; i < N; i++)
{
if (Str.charAt(i) == 'I' )
arr[i] = START++;
if (Str.charAt(i) == 'D' )
arr[i] = END--;
}
arr[N] = START;
return arr;
}
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] + " " );
}
}
|
Python3
def DiStirngMatch( Str ):
N = len ( Str )
arr = (N + 1 ) * [ 0 ]
START, END = 0 , N
for i in range (N):
if ( Str [i] = = 'I' ):
arr[i] = START
START + = 1
if ( Str [i] = = 'D' ):
arr[i] = END
END - = 1
arr[N] = START
return arr
if __name__ = = "__main__" :
Str = "IDID"
N = len ( Str )
ptr = DiStirngMatch( Str )
for i in range (N + 1 ):
print (ptr[i], end = " " )
|
C#
using System;
class GFG{
static int []DiStirngMatch(String Str)
{
int N = Str.Length;
int []arr = new int [N + 1];
int START = 0, END = N;
for ( int i = 0; i < N; i++)
{
if (Str[i] == 'I' )
arr[i] = START++;
if (Str[i] == 'D' )
arr[i] = END--;
}
arr[N] = START;
return arr;
}
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] + " " );
}
}
|
Javascript
<script>
function DiStirngMatch( Str)
{
var N = Str.length;
var arr = Array(N).fill(0);
var START = 0, END = N;
for ( var i = 0; i < N; i++) {
if (Str[i] == 'I' )
arr[i] = START++;
if (Str[i] == 'D' )
arr[i] = END--;
}
arr[N] = START;
return arr;
}
var Str = "IDID" ;
var N = Str.length;
var ptr = DiStirngMatch(Str);
for ( var i = 0; i <= N; i++)
document.write( ptr[i] + " " );
</script>
|
Time Complexity: O (N)
Auxiliary Space: O (N)
Share your thoughts in the comments
Please Login to comment...