【发布时间】:2022-01-24 23:12:02
【问题描述】:
基本上,我有一组单词,其中大约 250,000 个单词,并且希望能够返回在给定字符串中找到哪些单词的列表。
例如。输入字符串是'APPLEASEDITION',我想返回
[APP,APPLE,PLEA, PLEAS,PLEASE,PLEASED,lEA,LEAS,LEASE,LEASED,EA,EAS,EASE,EASED,AS,SEDITION,EDITION,IT,TI,ON]
我想出了这段代码,对于较短的输入字符串(最多 15 个字符),它比上面提到的方法运行得更快,但每个添加的字母都会使执行时间加倍:
const findWords = (instring, solutions = null) => {
if (!solutions) solutions = new Set();
if (!instring) {
return new Set();
}
if (words[instring]) {
solutions.add(instring);
}
const suffix = instring.slice(1);
const prefix = instring.slice(0, instring.length - 1);
if (!solutions.has(prefix))
solutions = new Set([...solutions, ...findWords(prefix, solutions)]);
if (!solutions.has(suffix))
solutions = new Set([...solutions, ...findWords(suffix, solutions)]);
return solutions;
};
想知道是否有人可以帮助我优化代码?
编辑:
我做了一个不同的解决方案,效果更好
const getAllSubstrings = (str) => {
let result = [];
for (let i = 0; i < str.length; i++) {
for (let j = i + 1; j < str.length + 1; j++) {
result.push(str.slice(i, j));
}
}
return result;
}
const findWords = (instring) => {
const solutions = []
let subs = getAllSubstrings(instring)
for (let sub of subs) {
if (words[sub])
solutions.push(sub)
}
return solutions
}
仍然对可能的改进持开放态度,但这对我的用例来说已经足够好了
【问题讨论】:
-
您可能需要依赖某种启发式方法或索引来生成列表:您所做的只是通过所有组合暴力破解您的方式,这是低效且 O(n) 复杂的.
-
你考虑过在服务器端做这个吗?或者使用现有的库(可能是用 WASM 编写的库)? JS 是单线程的,因此您需要在主线程之外高效地执行此操作(如 WASM)
-
您是否考虑过使用trie?这似乎是解决问题的正确方法,特别是如果您想将字典重用于多个测试用例。
标签: javascript string algorithm search scrabble