algorithm - 在字符串中查找短语的更有效方法?
问题描述
我有一个包含 100,000 多个按长度排序的单词/短语的列表
let list = [“string with spaces”, “another string”, “test”, ...]
我需要在上面的列表中找到给定句子中最长的元素。这是我最初的解决方案
for item in list {
if sentence == item
|| sentence.startsWith(item + “ “)
|| sentence.contains(“ “ + item + “ “)
|| sentence.endsWith(“ “ + item) {
...
break
}
}
我遇到的这个问题是这对我的应用程序来说太慢了。我可以采取不同的方法来加快速度吗?
解决方案
您可以从列表中构建一个 Aho-Corasick 搜索器,然后在句子上运行它。根据https://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_algorithm “算法的复杂性在字符串长度加上搜索文本的长度加上输出匹配的数量是线性的。注意因为找到了所有匹配项,所以如果每个子字符串都匹配(例如字典 = a、aa、aaa、aaaa 和输入字符串是 aaaa),则可能有二次匹配数。"
推荐阅读
- javascript - Framework7 中的自动完成和多个值
- c# - 在 C# 中使用 datatable 参数执行存储过程时出错
- dart - Flutter 中具有 Snap 效果的水平滚动卡片
- reactjs - 如何在反应js的导航中添加和删除活动类
- android - 我在导航抽屉内有一个微调器,当我选择一个微调器下拉项时,我正在打开一个活动,该活动有三个 TabLayout
- regex - 从 Oracle 消息错误中获取子字符串
- java - firebase 中的“equalTo”和“startAt & endAt”有什么不同,什么时候应该使用“equalTo”或“startAt 和 endAt”?
- javascript - 在 JavaScript 中访问 Office UI Fabric 主题颜色
- c - cvDiv 抛出异常
- c# - ServiceStack.OrmLite:再一次,序列化失败,当从 blobbed 字段读回布尔值时,它变成了一个字符串