Редакция для Массив частот букв


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 встречается в строке.

Так как букв всего 26, удобно завести массив cnt длины 26, где:

  • cnt[0] — количество букв a
  • cnt[1] — количество букв b
  • ...
  • cnt[25] — количество букв z

Дальше достаточно пройти по строке и для каждой буквы увеличить соответствующий элемент массива на 1.

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

  1. В строке встречаются только строчные латинские буквы, значит каждая буква однозначно соответствует одному индексу от 0 до 25.

  2. Для символа c индекс можно получить как:

    • в C++: c - 'a'
    • в Python: ord(c) - ord('a')
  3. После одного прохода по строке все частоты уже будут известны.

  4. Выводить нужно именно 26 чисел в порядке букв алфавита: от a до z.

3. Алгоритм

  1. Считать строку s.
  2. Создать массив cnt из 26 нулей.
  3. Для каждого символа c в строке:
    • найти его индекс от 0 до 25
    • увеличить cnt[index] на 1
  4. Вывести все 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)

Комментарии

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