Редакция для Чистка дампа
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.
Submitting an official solution before solving the problem yourself is a bannable offence.
1. Идея
Нужно построить новую строку, проходя по исходной посимвольно.
Для каждого символа есть ровно три варианта:
- если это пробел, заменяем его на
_; - если это латинская буква, цифра или уже символ
_, оставляем его; - иначе это мусор, и такой символ просто пропускаем.
То есть задача сводится к обычной фильтрации строки по простым правилам.
2. Наблюдения
- Строку удобно обрабатывать слева направо, по одному символу.
- Никаких сложных преобразований нет: решение зависит только от текущего символа.
- Важно читать всю строку целиком, включая пробелы.
Поэтому:
- в C++ нужно использовать
getline(cin, s); - в Python достаточно
input(), так как вход состоит из одной строки.
- в C++ нужно использовать
- Если все символы окажутся мусором, результатом будет пустая строка. Это нормально: нужно просто вывести пустую строку.
3. Алгоритм
- Считать всю строку
s. - Создать пустую строку результата.
- Для каждого символа
cвs:- если
c == ' ', добавить в результат_; - иначе если
c— одна из латинских буквa-z,A-Z, цифра0-9или_, добавитьcв результат; - иначе ничего не делать.
- если
- Вывести результат.
4. Почему это работает
Докажем, что алгоритм строит именно ту строку, которая требуется по условию.
Рассмотрим любой символ исходной строки:
- Если это пробел, по условию его нужно заменить на
_. Алгоритм делает ровно это. - Если это допустимый символ — латинская буква, цифра или
_, по условию он не считается мусором и должен остаться в строке. Алгоритм добавляет его в результат без изменений. - Если это любой другой печатный ASCII-символ, он считается мусором и должен быть удалён. Алгоритм его не добавляет.
Так обрабатывается каждый символ независимо и строго по правилам задачи. Значит, после прохода по всей строке результат совпадает с требуемой очищенной строкой.
5. Сложность
Пусть длина строки равна n.
- Время работы:
O(n), потому что каждый символ обрабатывается один раз. - Память:
O(n), потому что нужно хранить результирующую строку.
6. Код на C++17
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
string s;
getline(cin, s);
string result;
result.reserve(s.size());
for (char c : s) {
if (c == ' ') {
result.push_back('_');
} else if ((c >= 'a' && c <= 'z') ||
(c >= 'A' && c <= 'Z') ||
(c >= '0' && c <= '9') ||
c == '_') {
result.push_back(c);
}
}
cout << result;
return 0;
}
7. Код на Python 3
s = input()
res = []
for c in s:
if c == ' ':
res.append('_')
elif ('a' <= c <= 'z') or ('A' <= c <= 'Z') or ('0' <= c <= '9') or c == '_':
res.append(c)
print(''.join(res))
Комментарии