使用JavaScript解决这个编码难题

时间:2016-10-19 00:17:34

标签: javascript arrays algorithm scope closures

说明如下:

"编写一个函数,可以从列表中找到单词的所有字谜。您将获得两个输入单词和一个带单词的数组。你应该返回所有anagrams的数组或者如果没有则返回一个空数组。例如:

anagrams(' 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"]);
&#13;
&#13;
&#13;

我的直觉是将单词拆分为数组,然后使用另一个嵌套的for循环来匹配需要匹配的内容。但是,我似乎遇到了处理范围的一些问题,并且一直在破坏功能,所以我转向了聪明的人。如果你有一个时刻,我会很感激如何从这里解决这个问题。

1 个答案:

答案 0 :(得分:2)

您基本上需要查看第一个字符串中是否有permutation出现在数组中。

比较两个字符串是否相互排列的快速方法是对两个字符串进行排序并进行比较:

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,这是一种非常方便的方法,可以在某种条件下将数组煮沸到几个值。

注意我没有对此进行过测试,如果有任何问题请咨询。