给定的输入基本上是字典(字符串数组)和InputString。
我们想要找出字典中该字符串的所有可能的子字符串。
Input:
Dictionary: ["hell", "hello", "heaven", "ample", "his", "some", "other", "words"]
String: "hello world, this is an example"
Output: ["hell", "hello", "his", "ample"] //all the substrings that are in dictionary.
我能想到的解决方案是从字典中构建一个类似于trie的结构,然后运行以下循环
for(i= 0 to inputString.length)
substring = inputString.substring(i,length)
lookupInTrie(substring)
lookupInTrie(string)
this function returns list of complete words from trie that match the prefix of string.
i.e, if you pass in string "hello world" to this function and dictionary has word "hell" and "hello" then our lookup will return ["hell","hello"];
因此,如果我们不计算字典 - >转换。查找字典中给定字符串的所有子字符串可以在O(n ^ 2)时间内完成。
我想知道我们是否可以进一步优化这一点,并将复杂性从n ^ 2降低。
答案 0 :(得分:1)
您所描述的内容看起来像是使用Aho-Corasick string-matching algorithm的完美地点,suffix tree本质上是您在上面描述的算法的优化版本。它的工作原理是从模式字符串构建一个trie,然后通过它运行原始字符串,但这样做的方式不需要大量的回溯。总时间复杂度为O(m + n + z),其中m是要搜索的字符串的长度,n是模式字符串的总长度,z是匹配的数量。
你也可以在这里使用{{3}}。为句子构建后缀树然后在其中搜索每个模式需要时间O(m + n + z),其中m,n和z如上所述定义,尽管从头开始编码将非常困难。 / p>