Given a binary string S of size N, the task is to find the maximum number of operations that can be performed on S, by selecting any substring “01” and removing any character from it in a single move, reducing the length of the string by 1.
Examples:
Input: S = “001111”, N = 6
Output: 5
Explanation:
One way to perform the operations is:
- Select the substring “01” over the range [1, 2] and erase the S[2] ( = ‘1’). The string modifies to “00111”.
- Select the substring “01” over the range [1, 2] and erase the S[2] ( = ‘1’). The string modifies to “0011”.
- Select the substring “01” over the range [1, 2] and erase the S[2] ( = ‘1’). The string modifies to “001”.
- Select the substring “01” over the range [1, 2] and erase the S[1] ( = ‘0’). The string modifies to “01”.
- Select the substring “01” over the range [0, 1] and erase the S[1] ( = ‘1’). The string modifies to “0”.
- Now no characters can be removed.
Therefore, the total number of operations performed is 5, which is the maximum possible.
Input: S=”0101″, N=4
Output: 3
Approach: The given problem can be solved based on the following observations:
- Any 1s present in the prefix of S cannot be removed because there are no 0s before them.
- Any 0s present in the suffix of S cannot be removed because there are no 1s after them.
- All other characters are removable.
- If there are X removable characters, at most X-1 operations can be performed because, eventually, only a single character will remain which cannot be removed.
Follow the steps below to solve the problem:
- Initialize two variables, say X and Y as 0, which store the number of 0s in the suffix and the number of 1s in the prefix respectively, which cannot be removed.
- Iterate over the characters of the string S and perform the following steps:
- If the current character is ‘1′, increment Y by 1.
- Otherwise, stop traversing.
- Iterate over the characters of the string S in reverse order and perform the following steps:
- If the current character is 0, increment X by 1.
- Otherwise, stop traversing.
- If the sum of X and Y is equal to N, print 0 as there are no removable characters.
- Otherwise, print N-(X+Y)-1 as the answer.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int maxOperations(string S, int N)
{
int X = 0;
int Y = 0;
for ( int i = 0; i < N; i++) {
if (S[i] == '0' )
break ;
Y++;
}
for ( int i = N - 1; i >= 0; i--) {
if (S[i] == '1' )
break ;
X++;
}
if (N == X + Y)
return 0;
return N - (X + Y) - 1;
}
int main()
{
string S = "001111" ;
int N = S.length();
cout << maxOperations(S, N) << endl;
return 0;
}
|
Java
import java.io.*;
class GFG{
static int maxOperations(String S, int N)
{
int X = 0 ;
int Y = 0 ;
for ( int i = 0 ; i < N; i++)
{
if (S.charAt(i) == '0' )
break ;
Y++;
}
for ( int i = N - 1 ; i >= 0 ; i--)
{
if (S.charAt(i) == '1' )
break ;
X++;
}
if (N == X + Y)
return 0 ;
return N - (X + Y) - 1 ;
}
public static void main(String[] args)
{
String S = "001111" ;
int N = S.length();
System.out.println(maxOperations(S, N));
}
}
|
Python3
def maxOperations(S, N):
X = 0
Y = 0
for i in range (N):
if (S[i] = = '0' ):
break
Y + = 1
i = N - 1
while (i > = 0 ):
if (S[i] = = '1' ):
break
X + = 1
if (N = = X + Y):
return 0
return N - (X + Y) - 1
if __name__ = = '__main__' :
S = "001111"
N = len (S)
print (maxOperations(S, N))
|
C#
using System;
class GFG{
static int maxOperations(String S, int N)
{
int X = 0;
int Y = 0;
for ( int i = 0; i < N; i++)
{
if (S[i] == '0' )
break ;
Y++;
}
for ( int i = N - 1; i >= 0; i--)
{
if (S[i] == '1' )
break ;
X++;
}
if (N == X + Y)
return 0;
return N - (X + Y) - 1;
}
static void Main()
{
String S = "001111" ;
int N = S.Length;
Console.WriteLine(maxOperations(S, N));
}
}
|
Javascript
<script>
function maxOperations(S, N)
{
let X = 0;
let Y = 0;
for (let i = 0; i < N; i++)
{
if (S[i] == '0' )
break ;
Y++;
}
for (let i = N - 1; i >= 0; i--)
{
if (S[i] == '1' )
break ;
X++;
}
if (N == X + Y)
return 0;
return N - (X + Y) - 1;
}
let S = "001111" ;
let N = S.length;
document.write(maxOperations(S, N));
</script>
|
Time complexity: O(N)
Auxiliary Space: O(1)