Что означает S= ‘ ‘ S »? Почему пространство должно объединяться в обоих концах?

#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 никогда не достигает его.