首页 > 解决方案 > 比较javascript中的两个单词无法正常工作

问题描述

我想比较两个单词,其中一个单词的字母被打乱了。它工作正常,但如果我添加相同的字母,它会返回 true。我希望函数返回 false。有没有通用的方法来做到这一点。请在下面找到我的功能

const word1 = "apple"
const compareLetters = getWord => {
    const word1Array = word1.split('');
    const getWordArray = getWord.split('');
    return word1Array.every(word => getWordArray.includes(word))
}

compareLetters('aplep'); // -> this result gives true which is fine
compareLetters('apled'); // -> this gives false which is great
compareLetters('aplepppppppppppppppp'); // -> this give true as well. I wish to return this false

标签: javascript

解决方案


一种简单的方法是对两个字符串的字母进行排序,然后进行相等性检查:

const compareLetters = (a, b) => {
    return a.split('').sort().join('')
        === b.split('').sort().join('');
}

let compareApple = compareLetters.bind(null, "apple");

console.log(compareApple('aplep')); // true
console.log(compareApple('apled')); // false
console.log(compareApple('aplle')); // false
console.log(compareApple('aplepppppppppppppppp')); // false

从理论上讲,这不是最佳算法。更理想的是保持每个唯一字母的频率。但实际上,在 JavaScript 中这会更慢,除非你的字符串非常长。

为了完整起见,这是一个具有O(n)时间复杂度而不是O(nlogn)的解决方案:

const compareLetters = (a, b) => {
    if (a.length !== b.length) return false;
    let map = Object.fromEntries(Array.from(a, c => [c, 0]));
    for (let c of a) map[c]++;
    for (let c of b) if (!map[c]--) return false;
    return true;
}

let compareApple = compareLetters.bind(null, "apple");

console.log(compareApple('aplep')); // true
console.log(compareApple('apled')); // false
console.log(compareApple('aplle')); // false
console.log(compareApple('aplepppppppppppppppp')); // false


推荐阅读