我的数据结构类中遇到了一个问题,就是找到解决这个问题的方法。这与面试问题类似。如果有人能够解释问题的思考过程或解决方案。可以使用伪代码。到目前为止,我一直在考虑使用try来保存字典并查找那些提高效率的单词。
这是问题所在:
哦,不!当您发现不幸的查找/替换事故时,您刚刚完成了一份冗长的文档。您不小心删除了文档中的所有空格,标点符号和大小写。像“我重置计算机。它仍然没有启动!”这样的句子。将成为“iresetthecomputeritstilldidntboot”。一旦你将各个单词正确分开,你就可以计算出以后可以在标点和大写中添加回来。大多数单词都在字典中,但有些字符串,如专有名字,不会。
给定一个字典(一个单词列表),设计一种算法来找到“非复杂化”单词序列的最佳方式。在这种情况下,“最佳”被定义为最小化无法识别的字符序列数的解析。
例如,字符串“jesslookedjustliketimherbrother”将被最佳地解析为“JESS看起来就像TIM她的兄弟”。这个解析有七个无法识别的字符,为了清楚起见,我们已将其大写。
答案 0 :(得分:2)
对于每个索引n
,在字符串中,从该索引开始计算最优解的成本C(n)
(即:最佳解析中无法识别的字符数)。
然后,问题的解决方案是C(0)
。
C
有一个递归关系。在每个n
,您要么匹配i
字符的单词,要么跳过字符n
,产生成本1,然后以最佳方式解析其余部分。您只需要找到哪些选择成本最低。
让N
成为字符串的长度,让W(n)
成为一个集合,其中包含字符串中索引为n
的所有单词的长度。然后:
C(N) = 0
C(n) = min({C(n+1) + 1} union {C(n+i) for i in W(n)})
这可以通过动态编程实现,方法是从结尾开始构建C(n)表。
如果字典中最长单词的长度为L,则算法在最坏的情况下以O(NL)时间运行,如果您小心,则可以实现使用O(L)内存。 / p>
答案 1 :(得分:1)
您可以尝试部分模式匹配器,例如aho-corasick算法。基本上它是后缀树的特殊空间优化版本。
答案 2 :(得分:1)
您可以使用不同长度的滚动哈希来加速搜索。