Algorithm 在字符串中查找短语的更有效方法?

Algorithm 在字符串中查找短语的更有效方法?,algorithm,Algorithm,我有一个包含100000多个按长度排序的单词/短语的列表 let list = [“string with spaces”, “another string”, “test”, ...] 我需要在上面的列表中找到给定句子中最长的元素。这是我最初的解决方案 for item in list { if sentence == item || sentence.startsWith(item + “ “) || sentence.contains(“ “ +

我有一个包含100000多个按长度排序的单词/短语的列表

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
    }
}

我遇到的问题是,这对我的应用程序来说太慢了。有没有其他方法可以加快这个过程?

我会将给定的句子分解成一个单词列表,然后计算所有可能的相邻子列表(即短语)。给定一个由
n
单词组成的句子,可以在其中找到
n*(n+1)/2
可能的短语

如果现在将搜索短语列表(
[“带空格的字符串”、“另一个字符串”、“测试”、…])
)替换为(分期)固定时间查找数据结构(如哈希集),则可以浏览在上一步中计算的短语列表,并检查每个短语是否在~constant time中的集合中


此算法的总体时间复杂度在句子大小上按二次方进行缩放,大致与搜索词集的大小无关。

您可以从列表中构建一个Aho Corasick搜索器,然后在句子上运行此搜索器。根据“算法的复杂性是线性的,字符串长度加上搜索文本的长度加上输出匹配的数量。请注意,由于找到了所有匹配项,如果每个子字符串都匹配(例如,dictionary=a、aa、aaa、aaaa和输入字符串为aaaa),则可能存在二次匹配数。”我决定使用的解决方案是Trie。trie中的每个节点都是一个单词,我所做的就是标记输入句子(按单词)并遍历trie

这将性能从约140秒提高到约5秒