Answer

Answer

t.me/js_test

Ответ:

const anagram = (strA, strB) => {
  const buildCharObject = (str) => {
    const charObj = {};

    for (let char of str.replace(/[^\w]/g).toLowerCase()) {
      charObj[char] = charObj[char] + 1 || 1;
    }

    return charObj;
  };

  const aCharObject = buildCharObject(strA);
  const bCharObject = buildCharObject(strB);

  if (Object.keys(aCharObject).length !== Object.keys(bCharObject).length) {
    return false;
  }

  for (let char in aCharObject) {
    if (aCharObject[char] !== bCharObject[char]) {
      return false;
    }
  }

  return true;
};

Обьяснение:

Для хранения данных анаграммы стоит выбрать такую структуру, как объектный литерал JavaScript. Ключ в этом случае — символ буквы, значение — количество ее повторений в текущей строке.

Есть и другие условия:

  • Нужно убедиться в том, что регистр букв при сравнении не учитывается. Просто преобразуем обе строки в нижний или верхний регистр.
  • Исключаем из сравнения все не-символы. Лучше всего работать с регулярными выражениями.

Обратите внимание на использование Object.keys() в ответе. Этот метод возвращает массив, содержащий имена или ключи в таком же порядке, в каком они встречаются в объекте. В этом случае массив будет таким:

[‘f’, ‘i’, ’n’, ‘d’, ‘e’, ‘r’]

Таким образом, мы получаем свойства объекта без необходимости выполнять объемный цикл. В задаче можно использовать этот способ со свойством .length — для проверки того, есть ли в обеих строках одинаковое количество символов — это важная особенность анаграмм.

Код для проверки:

const anagram = (strA, strB) => {
  const buildCharObject = (str) => {
    const charObj = {};

    for (let char of str.replace(/[^\w]/g).toLowerCase()) {
      charObj[char] = charObj[char] + 1 || 1;
    }

    return charObj;
  };

  const aCharObject = buildCharObject(strA);
  const bCharObject = buildCharObject(strB);

  if (Object.keys(aCharObject).length !== Object.keys(bCharObject).length) {
    return false;
  }

  for (let char in aCharObject) {
    if (aCharObject[char] !== bCharObject[char]) {
      return false;
    }
  }

  return true;
};

console.log(anagram('finder', 'Friend')); //true
console.log(anagram('hello', 'bye')); //false 

Report Page