Редакция для Самая длинная серия


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

1. Идея

Нужно найти самую длинную подряд идущую группу одинаковых символов в строке.

Для этого достаточно один раз пройти по строке слева направо и поддерживать:

  • cur — длину текущей серии одинаковых символов;
  • ans — максимальную длину серии среди всех уже просмотренных.

Если текущий символ совпадает с предыдущим, серия продолжается, значит cur увеличивается на 1.
Если не совпадает, начинается новая серия длины 1.

После каждого шага обновляем ответ.


2. Наблюдения

  1. Нас интересуют только соседние символы. Если s[i] == s[i - 1], то текущая серия продолжается.

  2. Если s[i] != s[i - 1], то старая серия закончилась, и новая начинается с текущего символа.

  3. Так как строка непустая, минимальный ответ всегда равен 1.

  4. Нет необходимости хранить все серии или использовать дополнительные структуры данных. Достаточно двух чисел.


3. Алгоритм

  1. Считать строку s.
  2. Инициализировать:
    • ans = 1
    • cur = 1
  3. Для каждого индекса i от 1 до len(s) - 1:
    • если s[i] == s[i - 1], увеличить cur;
    • иначе присвоить cur = 1;
    • обновить ans = max(ans, cur).
  4. Вывести ans.

4. Почему это работает

Рассмотрим проход по строке.

  • В переменной cur всегда хранится длина серии одинаковых символов, которая заканчивается в текущей позиции.
  • Если очередной символ равен предыдущему, то серия действительно становится длиннее на 1.
  • Если символ отличается, то прежняя серия закончилась, и единственная серия, заканчивающаяся в текущей позиции, состоит только из этого символа, то есть имеет длину 1.

Значит, на каждом шаге cur вычисляется правильно.

Переменная ans хранит максимум среди всех значений cur, встретившихся во время прохода. Поскольку каждая серия заканчивается в какой-то позиции строки, максимальное значение cur и будет длиной самой длинной серии одинаковых подряд идущих сигналов.

Следовательно, алгоритм выводит правильный ответ.


5. Сложность

Пусть длина строки равна n.

  • Время работы: O(n), потому что строка просматривается один раз.
  • Дополнительная память: O(1), используются только две переменные.

6. Код на C++17

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s;
    cin >> s;

    int ans = 1;
    int cur = 1;

    for (int i = 1; i < (int)s.size(); i++) {
        if (s[i] == s[i - 1]) {
            cur++;
        } else {
            cur = 1;
        }
        if (cur > ans) {
            ans = cur;
        }
    }

    cout << ans << '\n';
    return 0;
}

7. Код на Python 3

s = input()

ans = 1
cur = 1

for i in range(1, len(s)):
    if s[i] == s[i - 1]:
        cur += 1
    else:
        cur = 1
    if cur > ans:
        ans = cur

print(ans)

Комментарии

Еще нет ни одного комментария.