Редакция для Массив частот букв
Submitting an official solution before solving the problem yourself is a bannable offence.
1. Идея
Нужно посчитать, сколько раз каждая буква от a до z встречается в строке.
Так как букв всего 26, удобно завести массив cnt длины 26, где:
cnt[0]— количество буквacnt[1]— количество буквb- ...
cnt[25]— количество буквz
Дальше достаточно пройти по строке и для каждой буквы увеличить соответствующий элемент массива на 1.
2. Наблюдения
В строке встречаются только строчные латинские буквы, значит каждая буква однозначно соответствует одному индексу от
0до25.Для символа
cиндекс можно получить как:- в C++:
c - 'a' - в Python:
ord(c) - ord('a')
- в C++:
После одного прохода по строке все частоты уже будут известны.
Выводить нужно именно 26 чисел в порядке букв алфавита: от
aдоz.
3. Алгоритм
- Считать строку
s. - Создать массив
cntиз 26 нулей. - Для каждого символа
cв строке:- найти его индекс от
0до25 - увеличить
cnt[index]на 1
- найти его индекс от
- Вывести все 26 значений массива через пробел.
4. Почему это работает
Рассмотрим любой символ строки.
- Если это буква
a, то увеличитсяcnt[0]. - Если это буква
b, то увеличитсяcnt[1]. - ...
- Если это буква
z, то увеличитсяcnt[25].
Мы обрабатываем каждый символ строки ровно один раз, и каждый раз добавляем 1 к счётчику именно той буквы, которую встретили.
Значит после обработки всей строки:
cnt[0]будет равно числу буквa,cnt[1]будет равно числу буквb,- ...
cnt[25]будет равно числу буквz.
Именно это и требуется вывести, поэтому алгоритм корректен.
5. Сложность
Пусть длина строки равна n.
- Время работы:
O(n), потому что строка проходится один раз. - Дополнительная память:
O(1), так как массив из 26 элементов имеет фиксированный размер.
6. Код на C++17
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
vector<int> cnt(26, 0);
for (char c : s) {
cnt[c - 'a']++;
}
for (int i = 0; i < 26; i++) {
if (i > 0) cout << ' ';
cout << cnt[i];
}
cout << '\n';
return 0;
}
7. Код на Python 3
s = input()
cnt = [0] * 26
for c in s:
cnt[ord(c) - ord('a')] += 1
print(*cnt)
Комментарии