javascript - 比较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
解决方案
一种简单的方法是对两个字符串的字母进行排序,然后进行相等性检查:
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
推荐阅读
- json - 使用 cloudformation 在云端添加 ssl 证书时出现错误(需要指定)
- python - 是否可以在 multiprocessing.Process 中传递 ndarray 类型的对象?
- algorithm - 如何根据最小道路中的最大拱门数停止 Bellman-Ford 算法
- reactjs - Material UI 自动完成:在自定义菜单下拉列表中渲染失去焦点
- html - iOS Safari 中设备旋转后页面底部的空白
- python - 在行之间的差异大于一定数量的地方放置 NaN
- python - 尝试获取电子商务 Django 项目中每个项目的总销售额
- python - 在python中将PCM WAV转换为普通WAV
- csv - Elixir 初学者:解析 CSV 文件
- node.js - Heroku 说我没有 Procfile