Вопрос проверяет знание оптимальных алгоритмов и оценки временной сложности.
Для линейного времени используется подсчет символов.
Алгоритм проходит по строкам один раз.
Используется массив или Map для частот.
Временная сложность O(n).
Это оптимальное решение задачи.
Чтобы добиться линейной сложности, нужно отказаться от сортировки.
Определение:
Алгоритм подсчета символов сравнивает частоту каждого символа в двух строках.
Перед выполнением важно проверить длину строк.
Основные шаги:
Создать массив или Map счетчиков.
Пройти по первой строке и увеличить счетчики.
Пройти по второй строке и уменьшить счетчики.
Проверить, что все значения равны нулю.
int[] freq = new int[256];
for (char c : s1.toCharArray()) {
freq[c]++;
}
for (char c : s2.toCharArray()) {
freq[c]--;
}
Если:
все freq[i] == 0
то строки — анаграммы.
Каждый символ обрабатывается один раз.
Нет вложенных циклов.
Размер вспомогательной структуры фиксирован.
Подсчет символов позволяет проверить анаграммы за O(n), что делает этот алгоритм оптимальным по времени.