Longest substring of 0s in a string formed by k concatenations
Last Updated :
17 Aug, 2022
Given a binary string of length n and an integer k. Consider another string T which is formed by concatenating the given binary string k times. The task is to print the maximum size of a substring of T containing only zeroes.
Examples:
Input: str = 110010, k = 3
Output: 2
str = 110010 T = 110010110010110010(formed after 3 times concatenating str). So, the maximum size of a substring of T(110010110010110010) containing only zeroes is 2.
Input: str = 00100110, k = 5
Output: 3
Here, str = 00100110, T = 0010011000100110001001100010011000100110. So, the maximum size of a substring of T containing only zeroes is 3.
A Naive approach is to concatenate K copies of string and traverse through all the elements and count maximum size of substring containing only zeroes.
Efficient Approach:
There is no need to concatenate K copies.
- If string contains only zeroes then the answer is length_of_string * K.
- If string is comprised of both zeroes and ones, then the answer is either the maximum length of a substring of string containing only zeroes, or the sum of the length of the prefix of A containing only zeroes and the length of the suffix of string containing only zeroes.
- One thing to keep note of is that if K=1, then there is no need for prefix and suffix check.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int subzero(string str, int k)
{
int ans = 0, curr = 0;
int len = str.length();
for ( int i = 0; i < len; ++i) {
if (str[i] == '0' )
curr++;
else
curr = 0;
ans = max(ans, curr);
}
if (ans == len)
return len * k;
else {
int pre = 0, suff = 0;
for ( int i = 0; i < len; i++) {
if (str[i] == '0' )
pre++;
else
break ;
}
for ( int i = len - 1; i >= 0; i--) {
if (str[i] == '0' )
suff++;
else
break ;
}
if (k > 1)
ans = max(ans, pre + suff);
return ans;
}
}
int main()
{
string str = "00100110" ;
int k = 5;
cout << subzero(str, k);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
import java.lang.*;
class GfG {
public static int subzero(String s, int k)
{
int ans = 0 , curr = 0 ;
int len = s.length();
char [] str = s.toCharArray();
for ( int i = 0 ; i < len; ++i) {
if (str[i] == '0' )
curr++;
else
curr = 0 ;
ans = Math.max(ans, curr);
}
if (ans == len)
return len * k;
else {
int pre = 0 , suff = 0 ;
for ( int i = 0 ; i < len; i++) {
if (str[i] == '0' )
pre++;
else
break ;
}
for ( int i = len - 1 ; i >= 0 ; i--)
{
if (str[i] == '0' )
suff++;
else
break ;
}
if (k > 1 )
ans = Math.max(ans, pre + suff);
return ans;
}
}
public static void main(String[] args)
{
String str = "00100110" ;
int k = 5 ;
System.out.println(subzero(str, k));
}
}
|
Python
def subzero( str , k):
ans = 0
curr = 0
n = len ( str )
for i in str :
if (i = = '0' ):
curr + = 1
else :
curr = 0
ans = max (ans, curr)
if (ans = = n):
print (n * k)
return
else :
pre = suff = 0
for i in str :
if (i = = '0' ):
pre + = 1
else :
break
for i in range (n - 1 , - 1 , - 1 ):
if ( str [i] = = '0' ):
suff + = 1
else :
break
if (k > 1 ):
ans = max (ans, pre + suff)
print (ans)
return
k = 5
str = '00100110'
subzero( str , k)
|
C#
using System;
class GFG
{
public static int subzero(String s, int k)
{
int ans = 0, curr = 0;
int len = s.Length;
char [] str = s.ToCharArray();
for ( int i = 0; i < len; ++i)
{
if (str[i] == '0' )
curr++;
else
curr = 0;
ans = Math.Max(ans, curr);
}
if (ans == len)
return len * k;
else
{
int pre = 0, suff = 0;
for ( int i = 0; i < len; i++)
{
if (str[i] == '0' )
pre++;
else
break ;
}
for ( int i = len - 1; i >= 0; i--)
{
if (str[i] == '0' )
suff++;
else
break ;
}
if (k > 1)
ans = Math.Max(ans, pre + suff);
return ans;
}
}
public static void Main()
{
String str = "00100110" ;
int k = 5;
Console.Write(subzero(str, k));
}
}
|
PHP
<?php
function subzero( $str , $k )
{
$ans = 0;
$curr = 0;
$len = strlen ( $str );
for ( $i = 0; $i < $len ; ++ $i )
{
if ( $str [ $i ] == '0' )
$curr ++;
else
$curr = 0;
$ans = max( $ans , $curr );
}
if ( $ans == $len )
return $len * $k ;
else
{
$pre = 0;
$suff = 0;
for ( $i = 0; $i < $len ; $i ++)
{
if ( $str [ $i ] == '0' )
$pre ++;
else
break ;
}
for ( $i = $len - 1; $i >= 0; $i --)
{
if ( $str [ $i ] == '0' )
$suff ++;
else
break ;
}
if ( $k > 1)
$ans = max( $ans , $pre + $suff );
return $ans ;
}
}
$str = "00100110" ;
$k = 5;
echo subzero( $str , $k );
?>
|
Javascript
<script>
function subzero(s,k)
{
let ans = 0, curr = 0;
let len = s.length;
let str = s.split( "" );
for (let i = 0; i < len; ++i) {
if (str[i] == '0 ')
curr++;
else
curr = 0;
ans = Math.max(ans, curr);
}
// if all elements in string are ' 0 '
if (ans == len)
return len * k;
// Else, find size of prefix and
// suffix containing only zeroes
else {
let pre = 0, suff = 0;
// Calculate prefix containing
// only zeroes
for (let i = 0; i < len; i++) {
if (str[i] == ' 0 ')
pre++;
else
break;
}
// Calculate suffix containing
// only zeroes
for (let i = len - 1; i >= 0; i--)
{
if (str[i] == ' 0')
suff++;
else
break ;
}
if (k > 1)
ans = Math.max(ans, pre + suff);
return ans;
}
}
let str = "00100110" ;
let k = 5;
document.write(subzero(str, k));
</script>
|
Complexity Analysis:
- Time Complexity: O(n) as there is a single loop used in the subzero() function.
- Space Complexity: O(1) as there is no extra space used.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...