Проблема с решением этой головоломки кодирования с помощью JavaScript

#javascript #arrays #algorithm #scope #closures

#javascript #массивы #алгоритм #область #замыкания

Вопрос:

Инструкции следующие:

«Напишите функцию, которая найдет все анаграммы слова из списка. Вам будут предоставлены два входных данных — слово и массив со словами. Вы должны вернуть массив всех анаграмм или пустой массив, если таковых нет. Например:

анаграммы(‘abba’, [‘aabb’, ‘abcd’, ‘bbaa’, ‘dada’]) => [‘aabb’, ‘bbaa’]»

Я поймал фрагмент, который принимает первый параметр и предоставляет все возможные комбинации символов. Моя проблема сейчас заключается в том, чтобы выяснить, как сопоставить этот массив со вторым параметром и вернуть некоторые результаты..

 function allAnagrams (word,words) {
  

  if (word.length < 2) {
    return [word];
  } else {
      var allAnswers = [];
      
      
      for (var i = 0; i < word.length; i  ) {
        var letter = word[i];
        var shorterWord = word.substr(0, i)   word.substr(i   1, word.length - 1);
        var shortwordArray = allAnagrams(shorterWord);
        for (var j = 0; j < shortwordArray.length; j  ) {
          allAnswers.push(letter   shortwordArray[j]);
          
        }
        
      }
      
      return allAnswers;
  }
  
}



allAnagrams("abc",["acb","cba","bac","bca"]);  

Моим инстинктом было разделить слово на массив, а затем создать еще один вложенный цикл for, чтобы соответствовать тому, что нужно сопоставить. Однако, похоже, я столкнулся с некоторыми проблемами с обработкой области видимости и продолжаю нарушать функцию, поэтому я обратился к вам, люди с блестящим умом. Если у вас есть минутка, я был бы признателен за подсказку о том, как решить это отсюда.

Ответ №1:

В основном вам нужно посмотреть, появляется ли какая-либо перестановка вашей первой строки в массиве.

Быстрый способ сравнить, являются ли две строки перестановками друг друга, — это отсортировать две строки и сравнить:

 function stringSort(string) {
  return string.split('').sort().join('');
}

function isAnagram(first, second) {
  // are the two sorted strings equal, if so then anagram
  return stringSort(first) == stringSort(second);
}
  

Теперь мы можем использовать эти удобные функции, чтобы помочь нам создать конечную желаемую функцию:

 function allAnagrams(word, words) {
  return words.filter(function(element) {
    return isAnagram(word, element);
  });
}
  

Обратите внимание на использование Array#filter , очень удобного метода для сведения массива к нескольким значениям при некоторых условиях.

Обратите внимание, что я не тестировал это, поэтому, если есть какие-либо проблемы, пожалуйста, спросите.

Комментарии:

1. Это хорошо. Может быть оптимизировано путем предварительного вычисления stringSort(word) .

2. @Amadan Я понял, когда создавал это, что использовал термин «быстрый», не предпринимая никаких попыток оптимизировать xD

3. Это круто, действительно полезно знать. Если вы не возражаете, объясните, из чего именно извлекается параметр ‘element’? И будет ли предварительное вычисление, как сказал Амадан, просто добавлять разделяющее строку / сортирующее «слово» в функцию allAnagrams?

4. Вы можете взглянуть на все ссылки, которые я предоставляю в своем посте @Benediah, например, смотрите здесь Array#filter , чтобы узнать, что element такое

5. @Benediah вы также всецело заинтересованы в реализации и экспериментировании с моим кодом, попробуйте добавить console.log(element) , например.