JS代码中memo缓存未生效:如何让if分支读取缓存值?
问题分析与修复
核心问题
你的代码里setFixes函数的return用法完全错误:
if (memo.get(prefix)) return;这句会在第一次发现memo里已有前缀时,直接终止整个setFixes函数,导致后续所有前缀后缀都没机会处理,这也是你觉得分支没触发的核心原因——要么memo初始为空,要么函数提前退出了。- 另外,用
words.includes()做查询是O(n)的低效操作,不如先把单词转成Set,查询效率直接拉到O(1)。
修复后的代码
const words = [ "a", "alien", "born", "less", "lien", "never", "nevertheless", "new", "newborn", "the", "zebra", "zebra", ]; let compoundArr = []; let memo = new Map(); // 先把单词转成Set,提升查询效率 const wordSet = new Set(words); const setFixes = () => { for (let word of words) { for (let i = 1; i < word.length; i++) { const prefix = word.substring(0, i); const suffix = word.substring(i); // 前缀处理:如果memo里已有,直接跳过查询 if (!memo.has(prefix)) { if (wordSet.has(prefix)) { memo.set(prefix, true); } } // 后缀处理:同理,已有则跳过 if (!memo.has(suffix)) { if (wordSet.has(suffix)) { memo.set(suffix, true); } } } } }; const findCompound = () => { setFixes(); // 用Set去重,避免重复添加相同单词(比如原数组里的两个zebra) const tempSet = new Set(); for (let word of words) { for (let i = 1; i < word.length; i++) { const prefix = word.substring(0, i); const suffix = word.substring(i); if (memo.get(prefix) && memo.get(suffix)) { tempSet.add(word); } } } compoundArr = Array.from(tempSet); return compoundArr; }; findCompound(); console.log(compoundArr); // 输出:['alien', 'newborn']
关键修改点
- 替换return为跳过逻辑:把终止函数的
return改成判断!memo.has(),只有当memo里没有当前前缀/后缀时,才去查询单词集合,彻底避免重复操作。 - 用Set优化查询:将
words转成wordSet,has()方法的查询效率远高于includes(),尤其当单词量很大时差距明显。 - 结果去重:原数组里有重复的
zebra,用Set存储结果再转成数组,避免输出重复的复合单词。
内容的提问来源于stack exchange,提问作者Ezgi Ergün
相关产品推荐
相关产品推荐

