#python #recursion #divide-and-conquer
Вопрос:
Я изучал LeetCode и столкнулся с такой проблемой: учитывая строку s и целое число k, верните длину самой длинной подстроки s так, чтобы частота каждого символа в этой подстроке была больше или равна k.
Самое элегантное решение на данный момент приведено ниже, но я не понимаю
Ответ: Что он пытается сделать
for t in s.split(c)
Первый марш через заданную версию строки
Затем, взяв оригинал s
(НЕ заданный или список s
с дубликатами), разбейте s
, где символ, частота которого меньше k
? Затем брать по одной подстроке за раз? так что, если s="aabaaaacdmmmmmm"
, k=2
"b"
Сначала мы разделяемся, затем оцениваем aa, затем разделяемся "c"
и aabaaaa
не уверены, что получаем максимум
def longestSubstring(s, k):
for c in set(s):
if s.count(c) < k:
return max(longestSubstring(t, k) for t in s.split(c))
return len(s)
Ответ №1:
Если c == 'b'
, s.split(c)
разбивает входные данные на
['aa', 'aaaacdmmmmmm']
Затем он рекурсивно вызывает себя, чтобы получить длину самой длинной подстроки в каждой из них.
longestSubstring('aa', 2)
вернется 2
, потому что ни один из символов не имеет частоты меньше 2.
longestSubstring('aaaacdmmmmmm', 2)
сделает еще немного рекурсии, в конечном итоге вернется 6
, потому что это длина mmmmmm
.
max(2, 6)
возвращает 6
значение , возвращаемое функцией.
Комментарии:
1. Спасибо, что я очень ясно вижу, так что в основном t-это каждая подстрока до и после разделения
2. Верно. Обратите внимание, что когда
k > 2
он может разделиться более чем на 2 подстроки.3. еще один вопрос @Barмар, почему он возвращает len(ы), а не len(ы) общей исходной длины строки? Я думаю, что я только что понял, если нет персонажа, который его лен
4. Точно. Это базовый случай рекурсии, которая используется для
longestSubstring('aa', 2)