← Назад к вопросам
Проверка двух строк на анаграмму
2.0 Middle🔥 191 комментариев
#JavaScript Core
Условие
Напишите функцию isAnagram(str1, str2), которая проверяет, являются ли две строки анаграммами.
Требования
- Анаграмма - слово, составленное из тех же букв, что и другое слово
- Игнорировать регистр букв
- Игнорировать пробелы
Примеры
isAnagram("listen", "silent"); // true
isAnagram("finder", "Friend"); // true
isAnagram("hello", "world"); // false
isAnagram("Dormitory", "dirty room"); // true
isAnagram("a", "a"); // true
isAnagram("ab", "ba"); // true
Подсказка
Можно использовать объект для подсчета частоты символов или отсортировать строки.
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение
Задача на проверку анаграмм — проверяет понимание структур данных и алгоритмов сортировки. Это часто встречается на собеседованиях, так как показывает знание оптимизации.
Решение 1: Сортировка
Самый интуитивный подход — отсортировать буквы и сравнить:
function isAnagram(str1: string, str2: string): boolean {
// Очищаем строки: удаляем пробелы, приводим к нижнему регистру
const clean1 = str1.toLowerCase().replace(/\s/g, "");
const clean2 = str2.toLowerCase().replace(/\s/g, "");
// Проверяем длину
if (clean1.length !== clean2.length) {
return false;
}
// Сортируем буквы и сравниваем
const sorted1 = clean1.split("").sort().join("");
const sorted2 = clean2.split("").sort().join("");
return sorted1 === sorted2;
}
Анализ:
- Временная сложность: O(n log n) из-за сортировки
- Пространственная сложность: O(n) для новых строк
- Простота: высокая, код читаемый
Решение 2: Подсчёт частоты (оптимальное)
Более эффективный подход — подсчитать частоту каждого символа:
function isAnagramOptimal(str1: string, str2: string): boolean {
// Очищаем строки
const clean1 = str1.toLowerCase().replace(/\s/g, "");
const clean2 = str2.toLowerCase().replace(/\s/g, "");
// Проверяем длину
if (clean1.length !== clean2.length) {
return false;
}
// Создаём объект для подсчёта букв
const charCount: Record<string, number> = {};
// Считаем буквы первой строки
for (const char of clean1) {
charCount[char] = (charCount[char] || 0) + 1;
}
// Вычитаем буквы второй строки
for (const char of clean2) {
if (!charCount[char]) {
return false; // Буква не найдена или уже использована
}
charCount[char]--;
}
// Проверяем, что все буквы использованы
return Object.values(charCount).every(count => count === 0);
}
Анализ:
- Временная сложность: O(n) — два прохода по строке
- Пространственная сложность: O(1) для англиского алфавита (максимум 26 букв)
- Эффективность: лучше для больших строк
Решение 3: Использование Map
Можно использовать Map для более современного подхода:
function isAnagramMap(str1: string, str2: string): boolean {
const clean1 = str1.toLowerCase().replace(/\s/g, "");
const clean2 = str2.toLowerCase().replace(/\s/g, "");
if (clean1.length !== clean2.length) return false;
const charMap = new Map<string, number>();
for (const char of clean1) {
charMap.set(char, (charMap.get(char) || 0) + 1);
}
for (const char of clean2) {
if (!charMap.has(char)) return false;
charMap.set(char, charMap.get(char)! - 1);
if (charMap.get(char) === 0) charMap.delete(char);
}
return charMap.size === 0;
}
Примеры использования
console.log(isAnagram("listen", "silent")); // true
console.log(isAnagram("finder", "Friend")); // true
console.log(isAnagram("hello", "world")); // false
console.log(isAnagram("Dormitory", "dirty room")); // true
console.log(isAnagram("a", "a")); // true
console.log(isAnagram("ab", "ba")); // true
Сравнение подходов
| Подход | Сложность (время) | Сложность (память) | Читаемость | Рекомендация |
|---|---|---|---|---|
| Сортировка | O(n log n) | O(n) | Высокая | Прототипирование |
| Подсчёт | O(n) | O(1) | Средняя | Production |
| Map | O(n) | O(n) | Средняя | Modern code |
Рекомендации для собеседования
- Начните с сортировки — просто и быстро реализуется
- Потом предложите оптимизацию — покажите знание алгоритмов
- Обсудите граничные случаи — пустые строки, одна буква
- Объясните трейд-офф — O(n) время vs O(1) память
- Упомяните регулярные выражения — для очистки строк
Для реального проекта выбирайте подход с подсчётом (O(n)) — это оптимальное соотношение скорости и простоты.