Вемс тепирв
😄! Начнем неделю с разбора не самой сложной, но одной из самых популярных задач. Мы будем работать с анаграммами.
Что такое анаграммы?Анаграммы - это слова или фразы, полученные путем перестановки букв исходного слова или фразы. Например, "привет" и "тепирв" являются анаграммами.
Задача:Написать функцию, которая определяет, являются ли две строки анаграммами друг друга.
Алгоритм решения:1. Сначала обе строки приводятся к нижнему регистру и из них удаляются все символы пробелы. Это делается для того, чтобы избежать различий из-за регистра или пробелов.
2. Для каждой нормализованной строки создается объект, где ключи - это символы строки, а значения - количество их вхождений в строку. Функция
buildCharCountMap
использует метод
reduce
для преобразования массива символов строки в объект подсчета символов.
3. Если длины нормализованных строк различаются, то они точно не могут быть анаграммами, и функция возвращает
false
.
4. Для каждого символа из первой строки проверяется, совпадает ли количество его вхождений в обеих строках, используя созданные карты подсчета символов. Если для любого символа количество вхождений не совпадает, строки не являются анаграммами, и функция возвращает
false
.
5. Если все предыдущие проверки пройдены успешно, строки являются анаграммами, тогда функция возвращает
true
.
Решениеfunction isAnagram(str1, str2) {
const normalize = str => str.replace(/\s+/g, "").toLowerCase();
const buildCharCountMap = str => {
return str.split('').reduce((acc, char) => {
acc[char] = acc[char] + 1 || 1;
return acc;
}, {});
};
const normalizedStr1 = normalize(str1);
const normalizedStr2 = normalize(str2);
if (normalizedStr1.length !== normalizedStr2.length) {
return false;
}
const str1CharCount = buildCharCountMap(normalizedStr1);
const str2CharCount = buildCharCountMap(normalizedStr2);
for (let char in str1CharCount) {
if (str1CharCount[char] !== str2CharCount[char]) {
return false;
}
}
return true;
}
console.log(isAnagram("Привет", "тепирв")); // true
console.log(isAnagram("Привет", "Пока")); // false
Этот пример демонстрирует базовый подход к решению задачи об анаграммах. Мы нормализуем строки, удаляем не нужные символы, сравниваем их длины и подсчитываем количество каждого символа. Если все проверки прошли успешно, строки являются анаграммами.
А у вас есть идеи о том, как можно улучшить или изменить это решение? Или, может быть, у вас есть совершенно другой подход к решению? Делитесь своими мыслями и кодом в комментариях
💻#javascript #interview