Given a binary string S of size N, the task is to maximize the sum of the count of consecutive 0s present at the start and end of any of the rotations of the given string S.
Examples:
Input: S = “1001”
Output: 2
Explanation:
All possible rotations of the string are:
“1001”: Count of 0s at the start = 0; at the end = 0. Sum= 0 + 0 = 0.
“0011”: Count of 0s at the start = 2; at the end =Â 0. Sum = 2 + 0=2
“0110”: Count of 0s at the start = 1; at the end =Â 1. Sum= 1 + 1 = 2.
“1100”: Count of 0s at the start = 0; at the end = 2. Sum = 0 + 2 = 2
Therefore, the maximum sum possible is 2.
Input: S = “01010”
Output: 2
Explanation:Â
All possible rotations of the string are:
“01010”: Count of 0s at the start = 1; at the end = 1. Sum= 1+1=1
“10100”: Count of 0s at the start = 0; at the end = 2. Sum= 0+2=2
“01001”: Count of 0s at the start = 1; at the end =Â 0. Sum= 1+0=1
“10010”: Count of 0s at the start = 0; at the end =Â 1. Sum= 0+1=1
“00101”: Count of 0s at the start = 2; at the end =Â 0. Sum= 2+0=2
Therefore, the maximum sum possible is 2.
Â
Naive Approach: The simplest idea is to generate all rotations of the given string and for each rotation, count the number of 0s present at the beginning and end of the string and calculate their sum. Finally, print the maximum sum obtained. Â
Below is the implementation of the above approach:
Java
import java.util.*;
class GFG{
static void findMaximumZeros(String str, int n)
{
int c0 = 0 ;
for ( int i = 0 ; i < n; ++i)
{
if (str.charAt(i) == '0' )
c0++;
}
if (c0 == n)
{
System.out.print(n);
return ;
}
String s = str + str;
int mx = 0 ;
for ( int i = 0 ; i < n; ++i)
{
int cs = 0 ;
int ce = 0 ;
for ( int j = i; j < i + n; ++j)
{
if (s.charAt(j) == '0' )
cs++;
else
break ;
}
for ( int j = i + n - 1 ; j >= i; --j)
{
if (s.charAt(j) == '0' )
ce++;
else
break ;
}
int val = cs + ce;
mx = Math.max(val, mx);
}
System.out.print(mx);
}
public static void main(String[] args)
{
String s = "1001" ;
int n = s.length();
findMaximumZeros(s, n);
}
}
|
Time Complexity: O(N2)
Auxiliary Space: O(N)
Efficient Approach: The idea is to find the maximum number of consecutive 0s in the given string. Also, find the sum of consecutive 0s at the start and the end of the string, and then print the maximum out of them.Â
Follow the steps below to solve the problem:
Below is the implementation of the above approach:Â
Java
import java.util.*;
class GFG{
static void findMaximumZeros(String str, int n)
{
int c0 = 0 ;
for ( int i = 0 ; i < n; ++i)
{
if (str.charAt(i) == '0' )
c0++;
}
if (c0 == n)
{
System.out.print(n);
return ;
}
int mx = 0 ;
int cnt = 0 ;
for ( int i = 0 ; i < n; i++)
{
if (str.charAt(i) == '0' )
cnt++;
else
{
mx = Math.max(mx, cnt);
cnt = 0 ;
}
}
mx = Math.max(mx, cnt);
int start = 0 , end = n - 1 ;
cnt = 0 ;
while (str.charAt(start) != '1' && start < n)
{
cnt++;
start++;
}
while (str.charAt(end) != '1' && end >= 0 )
{
cnt++;
end--;
}
mx = Math.max(mx, cnt);
System.out.println(mx);
}
public static void main (String[] args)
{
String s = "1001" ;
int n = s.length();
findMaximumZeros(s, n);
}
}
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Please refer complete article on Maximum number of 0s placed consecutively at the start and end in any rotation of a Binary String for more details!