首页 > 解决方案 > 从列表中查找一个单词的所有字谜

问题描述

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

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

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","abcd","bbaa"]时显示['aabb', 'bbaa']

先感谢您。

标签: arraysstringalgorithmanagram

解决方案


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

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

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']));


推荐阅读