Решение python с самой длинной строкой что это значит —> для t в s.split(c)

#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)