#python #string
Вопрос:
Учитывая строку s, верните количество подстрок, содержащих только одну отдельную букву.
Ввод: s = «aaaba»
Вывод: 8
Пояснение: Подстроки с одной отдельной буквой «aaa», «aa», «a», «b». «ааа» происходит 1 раз.
«аа» встречается 2 раза.
«а» встречается 4 раза.
«b» встречается 1 раз.
Итак, ответ таков 1 2 4 1 = 8.
Я просматриваю этот фрагмент кода из одной из проблем с литкодом, мне трудно понять S = ' ' S ' '
эту часть. Кто-нибудь может помочь мне понять? Спасибо
def countLetters(self, S: str) -> int:
S = ' ' S ' '
total, count = 0, 1
for i in range(1, len(S)-1):
if S[i] != S[i-1]:
count = 1
else:
count = 1
total = count
return total
Комментарии:
1. По-видимому, он обеспечивает искусственные границы вокруг строки, так что
S[i] != S[i-1]
проверяет каждый символ исходной строки, не создавая никакихIndexError
s.2. @chepner если мы изменим S[i] !=s[i 1], нам все еще нужны искусственные границы вокруг строки?
3. Предполагая, что алгоритм в остальном верен , удаление пробелов означает, что вам нужно сделать что-то особенное с
S[0]
иS[-1]
, поскольку у них нет предыдущего или последующего символа (соответственно) для сравнения. Добавление пробелов удаляет эти особые случаи. (Как представляется,S
изначально предполагается, что это не содержит пробелов, так чтоS[0] != S[1]
это гарантированно верно.) Я не знаю, необходимо ли конечное пространство; оно, похоже, полностью игнорируется, учитываяrange
повторяемость.4. @chepner спасибо за отличное объяснение. Не уверен, как отметить это как хороший ответ
5. Я постараюсь добавить свой комментарий в качестве ответа, который имеет смысл, без необходимости на самом деле понимать, что делает код.
Ответ №1:
Без пробелов обработка оригинала S[0]
должна была бы рассматриваться как особый случай. Добавляя пробел в начало строки, S[1]
(исходный первый символ) обрабатывается так же, как и все остальные: он сравнивается с S[0]
(который, по определению, гарантированно отличается от S[1]
).
Мне не ясно, что конечное пространство необходимо, так как индекс i
никогда не достигает его.