Итак, пытаясь понять код, начинайте наизнанку, как в алгебре: freq[str[i] - 'a']++;
Все символы представлены в виде целочисленных значений.Даже расширенный алфавит Unicode включает в себя старую таблицу ASCII в виде значений 0-255 (как символы были представлены в виде 8-битных целых).
Таблица значений ASCII:
str[i]
- это i-тая буква строки, которая совпадает с массивом в C / C ++, поэтому к ней можно обращаться, используя скобочные обозначения от [0]
до [n]
, гдеn==str.size();
freq[]
- это массив, в котором мы будем хранить значения частоты для каждой буквы, инициализированные в 0 в каждом слоте командой memset(freq, 0, sizeof(freq));
.Индекс каждого слота в массиве freq[]
соответствует числовому представлению «насколько больше эта буква, чем строчная буква« а »».(Примечание: из этой реализации я предполагаю, что строка ввода str
будет состоять из строчных букв (без прописных букв, знаков препинания или цифр). Таким образом, freq[0]
соответствует количеству символов, которые на «0 больше, чем»«» или «a». Подсчеты для «b» можно найти в freq[1]
, подсчеты для «c» в freq[2]
и т. д. до freq [25], который содержит подсчеты для z.
Итак, freq[str[i] - 'a']
обращается к слоту в массиве freq[]
, который соответствует соответствующей букве. Мы берем значение в этом слоте и увеличиваем его на 1, потому что мы только что обнаружили этот символ в str [i] . Помните, что в начале первого цикла for, который содержит строку кода, которую мы анализируем, все значения равны 0. Способ записи - это фрагмент кода, который вы процитировали: freq[str[i] - 'a']++;