{x}
blog image

String Without AAA or BBB

Given two integers a and b, return any string s such that:

  • s has length a + b and contains exactly a 'a' letters, and exactly b 'b' letters,
  • The substring 'aaa' does not occur in s, and
  • The substring 'bbb' does not occur in s.

 

Example 1:

Input: a = 1, b = 2
Output: "abb"
Explanation: "abb", "bab" and "bba" are all correct answers.

Example 2:

Input: a = 4, b = 1
Output: "aabaa"

 

Constraints:

  • 0 <= a, b <= 100
  • It is guaranteed such an s exists for the given a and b.

Solution Explanation

This problem requires constructing a string of length a + b containing exactly a 'a's and b 'b's, without the substrings "aaa" or "bbb". A greedy approach is the most efficient way to solve this.

The core idea is to iteratively add characters to the string, prioritizing the character that would lead to a less likely violation of the "no three consecutive identical characters" constraint.

Algorithm:

  1. Initialization: Create an empty string ans to store the result.

  2. Iteration: While both a and b are greater than 0, we perform the following:

    • Case 1 (a > b): Add "aab" to ans. This prevents three consecutive 'a's, as the next 'a' will be preceded by a 'b'. Update a to a - 2 and b to b - 1.
    • Case 2 (a < b): Add "bba" to ans. This is symmetrical to Case 1. Update a to a - 1 and b to b - 2.
    • Case 3 (a == b): Add "ab" to ans. This maintains balance. Update both a and b by decrementing them.
  3. Remainders: After the loop, if either a or b is greater than 0, it means there are remaining characters of that type. Append the remaining characters to ans.

  4. Return: Return the constructed string ans.

Code Explanation (Python):

class Solution:
    def strWithout3a3b(self, a: int, b: int) -> str:
        ans = []
        while a and b:
            if a > b:
                ans.append('aab')
                a, b = a - 2, b - 1
            elif a < b:
                ans.append('bba')
                a, b = a - 1, b - 2
            else:
                ans.append('ab')
                a, b = a - 1, b - 1
        if a:
            ans.append('a' * a)
        if b:
            ans.append('b' * b)
        return ''.join(ans)

The Python code directly implements the algorithm described above. It uses a list ans to efficiently build the string, converting it to a string at the end using ''.join(ans).

Time Complexity Analysis:

The while loop iterates at most min(a, b) times. The remaining operations (appending to the list and joining the list) take linear time with respect to the length of the string, which is a + b. Therefore, the overall time complexity is O(a + b).

Space Complexity Analysis:

The space used is dominated by the ans list, which stores at most a + b characters. Thus, the space complexity is O(a + b). This is also linear with respect to the input sizes. Note that the space used by the function's variables is constant, so it doesn't affect the overall space complexity.

The Java, C++, and Go code implementations follow the same algorithmic approach, with minor syntactic differences specific to each language. Their time and space complexities are also O(a + b).