【发布时间】:2017-03-02 17:11:46
【问题描述】:
查找字符串的最长子序列s,例如“abccdde” 并给出一个字典 {"ab","add","aced"} .上面例子的结果是“add”
我在一次采访中被问到,我用特里树给出了答案,最坏的情况是 O(n*m) , n 是 s 的长度 , m 是字典的长度。 但我的平均成本应该很低。我没有通过面试,因为面试官认为我的解决方案不是最好的。有人有更好的主意吗?
【问题讨论】:
-
您能否提供更多有关问题约束和解决方案的详细信息?如果您将 dictionary 存储在 trie 中,您的复杂度应该是
O(n*k)(其中k是起始字符串的长度),而不是O(n*m)。但是,如果您只在每个字典中查询一个单词,那就太糟糕了。 -
谢谢。我的解决方案使用特里树来存储字典。但是我为每个树节点添加了一个标签,以显示我们是否在字符串的某个前缀中具有该节点的前缀子序列。
-
对于 "abdc" 和字典是 {"abc","adc"}。特里树是 "a->(b->c,d->c)" 。最初,所有节点的标签都设置为假。下次我用一个Hashmap来存储我们感兴趣的所有节点,原因一开始,map是{'a':"a node"},我开始遍历abcd,当找到a时,我会设置"一个节点”为 true 。将“b 节点”和“d 节点”添加到地图中,我使用动态编程来遍历字符串并更新每个节点的状态。最长的“真实”节点将是解决方案。
-
我突然发现时间不是O(m*n),而是O(n+A),A是字符串中所有有效子序列的长度,因为我只遍历每个有效节点一次.
标签: algorithm subsequence