Generate a string consisting of characters ‘a’ and ‘b’ that satisfy the given conditions
Given two integers A and B, the task is to generate and print a string str such that:
- str must only contain the characters ‘a’ and ‘b’.
- str has length A + B and the occurrence of the character ‘a’ is equal to A and the occurrence of character ‘b’ is equal to B
- The sub-strings “aaa” or “bbb” must not occur in str.
Note: For the given values of A and B, a valid string can always be generated.
Examples:
Input: A = 1, B = 2 Output: abb "abb", "bab" and "bba" are all valid strings.
Input: A = 4, B = 1 Output: aabaa
Approach:
- If occurrence(a) > occurrence(b) then append “aab”
- If occurrence(b) > occurrence(a) then append “bba”
- If occurrence(a) = occurrence(b) then append “ab”
Since we reduce the difference between the occurrences of ‘a’ and ‘b’ by at most 1 in each iteration so “bba” and “aab” are guaranteed not to be followed by “aab” and “bba” respectively.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; // Function to generate and print the required string void generateString( int A, int B) { string rt; while (0 < A || 0 < B) { // More 'b', append "bba" if (A < B) { if (0 < B--) rt.push_back( 'b' ); if (0 < B--) rt.push_back( 'b' ); if (0 < A--) rt.push_back( 'a' ); } // More 'a', append "aab" else if (B < A) { if (0 < A--) rt.push_back( 'a' ); if (0 < A--) rt.push_back( 'a' ); if (0 < B--) rt.push_back( 'b' ); } // Equal number of 'a' and 'b' // append "ab" else { if (0 < A--) rt.push_back( 'a' ); if (0 < B--) rt.push_back( 'b' ); } } cout << rt; } // Driver code int main() { int A = 2, B = 6; generateString(A, B); return 0; } |
Java
// Java implementation of the approach class GFG { // Function to generate and // print the required string static void generateString( int A, int B) { String rt = "" ; while ( 0 < A || 0 < B) { // More 'b', append "bba" if (A < B) { if ( 0 < B--) { rt += ( 'b' ); } if ( 0 < B--) { rt += ( 'b' ); } if ( 0 < A--) { rt += ( 'a' ); } } // More 'a', append "aab" else if (B < A) { if ( 0 < A--) { rt += ( 'a' ); } if ( 0 < A--) { rt += ( 'a' ); } if ( 0 < B--) { rt += ( 'b' ); } } // Equal number of 'a' and 'b' // append "ab" else { if ( 0 < A--) { rt += ( 'a' ); } if ( 0 < B--) { rt += ( 'b' ); } } } System.out.println(rt); } // Driver code public static void main(String[] args) { int A = 2 , B = 6 ; generateString(A, B); } } // This code is contributed // by PrinciRaj1992 |
Python 3
# Python 3 implementation of the approach # Function to generate and print # the required string def generateString(A, B): rt = "" while ( 0 < A or 0 < B) : # More 'b', append "bba" if (A < B) : if ( 0 < B): rt = rt + 'b' B - = 1 if ( 0 < B): rt + = 'b' B - = 1 if ( 0 < A): rt + = 'a' A - = 1 # More 'a', append "aab" elif (B < A): if ( 0 < A): rt + = 'a' A - = 1 if ( 0 < A): rt + = 'a' A - = 1 if ( 0 < B): rt + = 'b' B - = 1 # Equal number of 'a' and 'b' # append "ab" else : if ( 0 < A): rt + = 'a' A - = 1 if ( 0 < B): rt + = 'b' B - = 1 print (rt) # Driver code if __name__ = = "__main__" : A = 2 B = 6 generateString(A, B) # This code is contributed by ita_c |
C#
// C# implementation of the approach using System; class GFG { // Function to generate and // print the required string static void generateString( int A, int B) { string rt = "" ; while (0 < A || 0 < B) { // More 'b', append "bba" if (A < B) { if (0 < B--) { rt += ( 'b' ); } if (0 < B--) { rt += ( 'b' ); } if (0 < A--) { rt += ( 'a' ); } } // More 'a', append "aab" else if (B < A) { if (0 < A--) { rt += ( 'a' ); } if (0 < A--) { rt += ( 'a' ); } if (0 < B--) { rt += ( 'b' ); } } // Equal number of 'a' and 'b' // append "ab" else { if (0 < A--) { rt += ( 'a' ); } if (0 < B--) { rt += ( 'b' ); } } } Console.WriteLine(rt); } // Driver code public static void Main() { int A = 2, B = 6; generateString(A, B); } } // This code is contributed by Ryuga |
PHP
<?php // PHP implementation of the approach // Function to generate and // print the required string function generateString( $A , $B ) { $rt = "" ; while (0 < $A || 0 < $B ) { // More 'b', append "bba" if ( $A < $B ) { if (0 < $B --) { $rt .= ( 'b' ); } if (0 < $B --) { $rt .= ( 'b' ); } if (0 < $A --) { $rt .= ( 'a' ); } } // More 'a', append "aab" else if ( $B < $A ) { if (0 < $A --) { $rt .= ( 'a' ); } if (0 < $A --) { $rt .= ( 'a' ); } if (0 < $B --) { $rt .= ( 'b' ); } } // Equal number of 'a' and 'b' // append "ab" else { if (0 < $A --) { $rt .= ( 'a' ); } if (0 < $B --) { $rt .= ( 'b' ); } } } echo ( $rt ); } // Driver code $A = 2; $B = 6; generateString( $A , $B ); // This code is contributed // by Code Mech ?> |
Javascript
<script> // Javascript implementation of the approach // Function to generate and // print the required string function generateString(A,B) { let rt = "" ; while (0 < A || 0 < B) { // More 'b', append "bba" if (A < B) { if (0 < B--) { rt += ( 'b' ); } if (0 < B--) { rt += ( 'b' ); } if (0 < A--) { rt += ( 'a' ); } } // More 'a', append "aab" else if (B < A) { if (0 < A--) { rt += ( 'a' ); } if (0 < A--) { rt += ( 'a' ); } if (0 < B--) { rt += ( 'b' ); } } // Equal number of 'a' and 'b' // append "ab" else { if (0 < A--) { rt += ( 'a' ); } if (0 < B--) { rt += ( 'b' ); } } } document.write(rt); } // Driver code let A = 2, B = 6; generateString(A, B); // This code is contributed by avanitrachhadiya2155 </script> |
Output
bbabbabb
Complexity Analysis:
- Time Complexity: O(Max(a,b))
- Auxiliary Space: O(Max(a,b))
Please Login to comment...