Задачи
242. Valid Anagram

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;
};

В данном случае, сложность операций разбивается на три части:

  1. Разбиение строки на массив символов: O(n), где n - длина строки s или t
  2. Сортировка массива символов: O(n log n), где n - длина строки s или t
  3. Слияние отсортированных массивов символов в строку: 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;
};
  1. charCount -- будем использовать для подсчета количества вхождений каждого символа в обеих строках.
  2. Проходимся по каждому символу в строках s и t и увеличиваем значение в объекте charCount для символа из строки s и уменьшаем для символа из строки t
  3. Проходимся по всем символам в объекте charCount и проверяем, что количество вхождений каждого символа == 0
    1. если это не так, то строки не анаграммы, и возвращаем false
    2. если все символы встречаются одинаковое количество раз в обеих строках, то мы возвращаем true

Такой подход позволяет получить алгоритмическую сложность O(n), где n длина строки s и t