Разбор задачи: Строка без AAA или BBB

Предложенный нами код:

 def strWithout3a3b(a: int, b: int) -> str:
    """
    :param a: Number of 'a' letters
    :param b: Number of 'b' letters
    :return: A string satisfying the conditions
    """
    result = []
    while a > 0 or b > 0:
        # Check if adding 'a' is valid and preferable
        if (a > b and (len(result) < 2 or result[-1] != 'a' or result[-2] != 'a')) or (len(result) >= 2 and result[-1] == 'b' and result[-2] == 'b'):
            result.append('a')
            a -= 1
        else:
            result.append('b')
            b -= 1
    return ''.join(result)

Данная функция создает строку, которая удовлетворяет следующим условиям:

  1. Длина строки равна сумме a и b.
  2. В строке содержится ровно a букв 'a' и ровно b букв 'b'.
  3. Подстроки 'aaa' и 'bbb' не должны встречаться в результирующей строке.

Давайте рассмотрим решение по частям:


1. Инициализация результата

result = []

Создаем пустой список result, который будет хранить итоговые символы строки. Лист используется для эффективного добавления символов.


2. Цикл работы

while a > 0 or b > 0:

Цикл продолжается до тех пор, пока есть хотя бы одна буква 'a' или 'b' для добавления в строку.


3. Выбор, какой символ добавить

if (a > b and (len(result) < 2 or result[-1] != 'a' or result[-2] != 'a')) or (len(result) >= 2 and result[-1] == 'b' and result[-2] == 'b'):
    result.append('a')
    a -= 1
else:
    result.append('b')
    b -= 1

Этот блок отвечает за выбор, какую букву добавить: 'a' или 'b'.

  • Логика добавления 'a':
    • Если a > b, т.е. оставшихся 'a' больше, чем 'b', то предпочтительнее добавить 'a'.
    • Проверяется, не нарушается ли условие отсутствия тройного 'aaa'. Это делается через проверку: последние два символа в result не равны 'a'.
    • Если последние два символа равны 'b' (т.е. образовалось 'bb'), то нужно добавить 'a', чтобы не образовалось тройного 'bbb'.
  • Логика добавления 'b':
    • Если условия для добавления 'a' не выполняются, то добавляется 'b'. Это происходит, если:
      • Символов 'b' больше или равно символам 'a'.
      • Условие для предотвращения тройного 'bbb' также проверяется.

После добавления символа 'a' или 'b' соответствующий счетчик уменьшается на единицу (a -= 1 или b -= 1).


4. Возвращение результата

return ''.join(result)

После завершения цикла список result преобразуется в строку с помощью метода join и возвращается.


Пошаговый пример выполнения

Пример входных данных:
a = 4, b = 1

  1. Итерация 1:
    • a > b → добавляем 'a'result = ['a'].
    • Уменьшаем a на 1: a = 3, b = 1.
  2. Итерация 2:
    • a > b → добавляем 'a'result = ['a', 'a'].
    • Уменьшаем a на 1: a = 2, b = 1.
  3. Итерация 3:
    • Последние два символа равны 'a', добавлять ещё одну 'a' нельзя.
    • Добавляем 'b'result = ['a', 'a', 'b'].
    • Уменьшаем b на 1: a = 2, b = 0.
  4. Итерация 4:
    • a > b → добавляем 'a'result = ['a', 'a', 'b', 'a'].
    • Уменьшаем a на 1: a = 1, b = 0.
  5. Итерация 5:
    • a > b → добавляем 'a'result = ['a', 'a', 'b', 'a', 'a'].
    • Уменьшаем a на 1: a = 0, b = 0.

Результат:
''.join(result) возвращает строку "aabaa".

 



Комментарии

xsnm_avatar
xsnm
,
4 месяца, 14 дней назад

a = 5
b = 1
# Input: a=5, b=5. Expected: ababababab, Got: aabaaabbbb
# Input: a=3, b=6. Expected: bbabbabb, Got: aababbbbb
print(strWithout3a3b(a, b))>>>> aabaaba
 

0

Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии