Как определить, являются ли две строки анаграммами
Что проверяют
Сам алгоритм простой, поэтому смотрят на детали Go: знаете ли вы разницу между байтами и рунами, выбираете ли структуру данных под ограничения и уточняете ли условия до кода. Следом просят написать тесты или спрашивают, что изменится для строк на кириллице.
Как отвечать
Сначала задайте вопросы: учитывается ли регистр, пробелы и знаки препинания, только ASCII или любой Unicode. От ответа зависит решение:
- подсчёт частот в
map[rune]int: проходим первую строку черезrangeи увеличиваем счётчики, по второй уменьшаем. Ушёл счётчик в минус, сразуfalse. Время O(n), память O(k), где k число разных символов; - массив
[26]int: если алфавит гарантированно латинский в нижнем регистре, индексc - 'a'и массив на стеке. Без аллокаций и хэширования, самый быстрый вариант; - сортировка: переводим строки в
[]rune, сортируем черезslices.Sortи сравниваем. Это O(n log n), зато код короткий. Хорошо назвать его как базовое решение и объяснить, почему подсчёт лучше.
Ранний выход по len(a) != len(b) корректен и для Unicode: len считает байты, но у строк из одного набора рун длина в UTF-8 совпадает. Если же вы приводите регистр через strings.ToLower или выбрасываете пробелы, длины сравнивают после нормализации.
Тесты в Go пишут табличные, с t.Run на каждый случай: пустые строки, разная длина, повторы вроде "aab" и "abb", кириллица "пила" и "липа", разный регистр.
Для полной корректности на Unicode упомяните нормализацию: буква «й» бывает одним символом или парой «и» плюс комбинируемый знак, и без golang.org/x/text/unicode/norm такие строки не совпадут.
Где спотыкаются
Берут [26]int и s[i] - 'a' без проверки входа. На кириллице или заглавных буквах индекс выходит за границы массива, и программа падает с паникой.
Не уточняют условия и молча решают для ASCII с учётом регистра. Потом выясняется, что "Listen" и "Silent" должны быть анаграммами, а решение говорит обратное.
Путают сложность: называют сортировку линейной или не замечают, что []rune это копия строки по четыре байта на символ.