Редакция для Только буквы


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. Идея

Нужно пройти по строке и оставить только те символы, которые являются латинскими буквами:

  • от a до z
  • от A до Z

Все остальные символы просто пропускаются.

Так как порядок букв менять нельзя, удобно строить ответ слева направо: если текущий символ — буква, добавляем его в результат, иначе игнорируем.

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

  1. Вход — одна строка без пробелов, значит её можно просто считать целиком.
  2. Проверка, является ли символ латинской буквой, делается очень просто:
    • либо c находится между a и z
    • либо c находится между A и Z
  3. Никаких сложных структур данных не нужно.
  4. Если в строке нет ни одной буквы, ответом будет пустая строка.

3. Алгоритм

  1. Считать строку s.
  2. Создать пустой результат.
  3. Для каждого символа c в строке:
    • если c лежит в диапазоне az или AZ, добавить его в ответ;
    • иначе ничего не делать.
  4. Вывести получившуюся строку.

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

Мы просматриваем все символы строки ровно в том порядке, в котором они стоят.

  • Если символ является латинской буквой, по условию его нужно сохранить, и алгоритм добавляет его в ответ.
  • Если символ не является латинской буквой, по условию его нужно удалить, и алгоритм его пропускает.

Значит, в ответ попадут все и только нужные символы, причём в исходном порядке. Это в точности и требуется.

5. Сложность

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

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

6. Код на C++17

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

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

    string ans;
    for (char c : s) {
        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
            ans += c;
        }
    }

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

7. Код на Python 3

s = input()

ans = []
for c in s:
    if ('a' <= c <= 'z') or ('A' <= c <= 'Z'):
        ans.append(c)

print(''.join(ans))

Комментарии

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