【问题标题】:Find all the anagrams of a word from a list从列表中查找一个单词的所有字谜
【发布时间】:2021-08-27 09:10:03
【问题描述】:

尝试解决代码战中的任务:

编写一个函数,从一个列表中找出一个单词的所有字谜。您将获得两个输入一个单词和一个带有单词的数组。您应该返回一个包含所有字谜的数组,如果没有则返回一个空数组。

anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']) => ['aabb', 'bbaa']

这是我的解决方案:

function anagrams(str, arr) {
  let newArr = [];
  for(let i = 0; i < arr.length; i++) {
    let result = str.split('').every(function(letter) {
      return arr[i].indexOf(letter) != -1;
    });
    if(result === true) {
      newArr.push(arr[i]);
    }
  }
  return newArr;
}

哪个不能正常工作:当需要['aabb', 'bbaa'] 时,它会显示["aabb","abcd","bbaa"]

提前谢谢你。

【问题讨论】:

    标签: arrays string algorithm anagram


    【解决方案1】:

    我认为您还需要管理信件数量。根据这段代码,您的输出中会出现abcd,因为abba 存在于其中。

    let result = str.split('').every(function(letter) {
          return arr[i].indexOf(letter) != -1;
    });
    

    【讨论】:

      【解决方案2】:

      虽然您的函数正确地检查了单词的每个字母是否出现在它的潜在变位词中,但它不会检查该字母的重复次数是否相同。

      您可以通过首先确定每个不同字母的计数来解决此问题:

      function getCounts(str) {
          letterCount = {};
          for (let letter of str) {
              letterCount[letter] ??= 0;
              letterCount[letter]++;
          }
          return letterCount;
      }
      
      function anagrams(str, arr) {
          counts = getCounts(str);
          return arr.filter(anagram =>
              anagram.length === str.length &&
              Object.entries(getCounts(anagram)).every(([letter, count]) =>
                  counts[letter] === count
              )
          );
      }
      
      console.log(anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']));

      【讨论】:

        猜你喜欢
        • 2011-09-19
        • 1970-01-01
        • 2019-06-25
        • 1970-01-01
        • 2013-12-29
        • 2019-11-21
        • 2011-02-07
        • 1970-01-01
        • 2013-09-20
        相关资源
        最近更新 更多