Valid Anagram (opens in a new tab)
Плохое решение
var isAnagram = function(s, t) {
const sortS = s.split('').sort().join('');
const sortT = t.split('').sort().join('');
if(sortS === sortT) { return true; }
return false;
};
В данном случае, сложность операций разбивается на три части:
- Разбиение строки на массив символов: O(n), где n - длина строки s или t
- Сортировка массива символов: O(n log n), где n - длина строки s или t
- Слияние отсортированных массивов символов в строку: O(n), где n - длина строки s или t
Таким образом, общая алгоритмическая сложность функции isAnagram будет O(n log n), где n - длина строки s или t.
Для оптимизации этой функции можно использовать [[хэш таблицу]]. //TODO
Хорошее решение
const isAnagram = function(s, t) {
if (s.length !== t.length) {
return false;
}
const charCount = {};
for (let i = 0; i < s.length; i++) {
charCount[s[i]] = (charCount[s[i]] || 0) + 1;
charCount[t[i]] = (charCount[t[i]] || 0) - 1;
}
for (let char in charCount) {
if (charCount[char] !== 0) {
return
false;
}
}
return true;
};
- charCount -- будем использовать для подсчета количества вхождений каждого символа в обеих строках.
- Проходимся по каждому символу в строках s и t и увеличиваем значение в объекте charCount для символа из строки s и уменьшаем для символа из строки t
- Проходимся по всем символам в объекте charCount и проверяем, что количество вхождений каждого символа == 0
- если это не так, то строки не анаграммы, и возвращаем false
- если все символы встречаются одинаковое количество раз в обеих строках, то мы возвращаем true
Такой подход позволяет получить алгоритмическую сложность O(n), где n длина строки s и t