Программа курса:
Разбор задачи: Разбиение строки на наибольшее количество частей
Предложенный нами код:
def partitionLabels(S):
"""
:type S: str
:rtype: List[int]
"""
sizes = []
while S:
i = 1
while set(S[:i]) & set(S[i:]):
i += 1
sizes.append(i)
S = S[i:]
return sizesРазбор решения
Функция partitionLabels разбивает строку S на наибольшее количество частей, чтобы каждая буква встречалась не более чем в одной части. Рассмотрим, как работает предложенный код поэтапно.
1. Инициализация
sizes = []
Здесь создаётся пустой список sizes, который будет хранить размеры найденных частей строки.
2. Цикл обработки строки
while S:
Основной цикл выполняется до тех пор, пока строка S не станет пустой. Это значит, что мы будем обрабатывать строку по частям до полного её исчерпания.
3. Определение текущей части
i = 1
while set(S[:i]) & set(S[i:]):
i += 1
- На первой итерации предполагается, что часть строки заканчивается на индексе
i = 1. set(S[:i])— множество символов в текущей части строки (от начала до индексаi).set(S[i:])— множество символов в оставшейся части строки (от индексаiдо конца).set(S[:i]) & set(S[i:])— пересечение двух множеств. Если пересечение не пустое, это значит, что символы из текущей части встречаются в оставшейся строке, и границу текущей части нужно сдвинуть дальше.
Пример:
- Пусть
S = "ababcbacadefegdehijhklij". - На первой итерации
i = 1иS[:i] = "a",S[i:] = "babcbacadefegdehijhklij".
Символ "a" встречается в оставшейся строке, поэтомуiувеличивается. - Этот процесс повторяется, пока символы текущей части не перестанут пересекаться с оставшейся строкой.
Когда цикл завершится, i указывает на индекс, где заканчивается текущая часть строки.
4. Добавление размера части
sizes.append(i)
После определения границы текущей части (i), её размер добавляется в список sizes.
5. Обновление строки
S = S[i:]
Строка обновляется, удаляя обработанную часть. Например:
- Если
S = "ababcbacadefegdehijhklij"иi = 9, после этого шагаS = "defegdehijhklij".
6. Возврат результата
return sizes
Когда цикл завершится и вся строка будет обработана, возвращается список sizes, содержащий размеры всех частей.
Пример работы
Рассмотрим пример:S = "ababcbacadefegdehijhklij"
- Начальная строка:
"ababcbacadefegdehijhklij".- Начальная часть:
"ababcbaca", размер:9. - Обновлённая строка:
"defegdehijhklij".
- Начальная часть:
- Новая строка:
"defegdehijhklij".- Начальная часть:
"defegde", размер:7. - Обновлённая строка:
"hijhklij".
- Начальная часть:
- Новая строка:
"hijhklij".- Начальная часть:
"hijhklij", размер:8. - Обновлённая строка:
"".
- Начальная часть:
Итоговый список размеров: [9, 7, 8].