Count of operations to make a binary string”ab” free
Last Updated :
25 Jul, 2022
Given a string containing characters ‘a’ and ‘b’ only. Convert the given string into a string in which there is no ‘ab’ substring. To make string ‘ab’ free we can perform an operation in which we select a ‘ab’ substring and replace it by ‘bba’.
Find the total number of operations required to convert the given string.
Examples:
Input : s = 'abbaa'
Output : 2
Explanation:
Here, ['ab'baa] is replaced s = [bbabaa]
[bb'ab'aa] is replaced s = [bbbbaaa]
which is ab free. Hence, 2 operations required.
Input : s = 'aab'
Output : 3
Explanation:
Here, [a'ab'] is replaced s = [abba]
['ab'ba] is replaced s = [bbaba]
[bb'ab'a] is replaced s = [bbbbaa]
which is ab free. Hence, 3 operations required.
Approach: The final state will be some character ‘a’ after ‘b’: “bbb…baaa…a”
It’s obvious to prove all ‘b’s are distinctive to each other(i.e. Each ‘b’ in the initial state, will add some number of ‘b’s to the final state disjoint from other ‘b’s). For a character ‘b’ from the initial state it will double after seeing a character ‘a’. For each i-th character ‘b’, consider ti the number of a before it. So the final number of ‘b’s can be defined as summation of 2^ti.
Below is the implementation of above approach.
C++
#include<bits/stdc++.h>
using namespace std;
int abFree(string s)
{
int n = s.length();
char char_array[n + 1];
strcpy (char_array, s.c_str());
int b_count = 0;
int res = 0;
for ( int i = 0; i < n; i++)
{
if (char_array[n - i - 1] == 'a' )
{
res = (res + b_count);
b_count = (b_count * 2);
} else {
b_count += 1;
}
}
return res;
}
int main()
{
string s = "abbaa" ;
cout<<abFree(s)<<endl;
s = "aab" ;
cout<<abFree(s)<<endl;
s = "ababab" ;
cout<<abFree(s)<<endl;
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int abFree( char [] s)
{
int b_count = 0 ;
int res = 0 ;
for ( int i = 0 ; i < s.length; i++)
{
if (s[s.length - i - 1 ] == 'a' )
{
res = (res + b_count);
b_count = (b_count * 2 );
} else {
b_count += 1 ;
}
}
return res;
}
public static void main(String[] args)
{
String s = "abbaa" ;
System.out.println(abFree(s.toCharArray()));
s = "aab" ;
System.out.println(abFree(s.toCharArray()));
s = "ababab" ;
System.out.println(abFree(s.toCharArray()));
}
}
|
Python3
def abFree(s):
b_count = 0
res = 0
for i in range ( len (s)):
if s[~i] = = 'a' :
res = (res + b_count)
b_count = (b_count * 2 )
else :
b_count + = 1
return res
s = 'abbaa'
print (abFree(s))
s = 'aab'
print (abFree(s))
s = 'ababab'
print (abFree(s))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int abFree( char [] s)
{
int b_count = 0;
int res = 0;
for ( int i = 0; i < s.Length; i++)
{
if (s[s.Length - i - 1] == 'a' )
{
res = (res + b_count);
b_count = (b_count * 2);
} else
{
b_count += 1;
}
}
return res;
}
public static void Main(String[] args)
{
String s = "abbaa" ;
Console.WriteLine(abFree(s.ToCharArray()));
s = "aab" ;
Console.WriteLine(abFree(s.ToCharArray()));
s = "ababab" ;
Console.WriteLine(abFree(s.ToCharArray()));
}
}
|
Javascript
<script>
function abFree(s)
{
var n = s.length;
var char_array = s.split( '' )
var b_count = 0;
var res = 0;
for ( var i = 0; i < n; i++)
{
if (char_array[n - i - 1] == 'a')
{
res = (res + b_count);
b_count = (b_count * 2);
} else {
b_count += 1;
}
}
return res;
}
var s = "abbaa" ;
document.write( abFree(s) + "<br>" );
s = "aab" ;
document.write( abFree(s) + "<br>" );
s = "ababab" ;
document.write( abFree(s) + "<br>" );
</script>
|
Output:
2
3
11
Time complexity : O(n)
Auxiliary Space : O(n)
Share your thoughts in the comments
Please Login to comment...