Программа курса:
Разбор задачи: Строка без 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)Данная функция создает строку, которая удовлетворяет следующим условиям:
- Длина строки равна сумме
aиb. - В строке содержится ровно
aбукв'a'и ровноbбукв'b'. - Подстроки
'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:
a > b→ добавляем'a'→result = ['a'].- Уменьшаем
aна 1:a = 3, b = 1.
- Итерация 2:
a > b→ добавляем'a'→result = ['a', 'a'].- Уменьшаем
aна 1:a = 2, b = 1.
- Итерация 3:
- Последние два символа равны
'a', добавлять ещё одну'a'нельзя. - Добавляем
'b'→result = ['a', 'a', 'b']. - Уменьшаем
bна 1:a = 2, b = 0.
- Последние два символа равны
- Итерация 4:
a > b→ добавляем'a'→result = ['a', 'a', 'b', 'a'].- Уменьшаем
aна 1:a = 1, b = 0.
- Итерация 5:
a > b→ добавляем'a'→result = ['a', 'a', 'b', 'a', 'a'].- Уменьшаем
aна 1:a = 0, b = 0.
Результат:''.join(result) возвращает строку "aabaa".
xsnm
,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