从字符串中取消连接单词而不使用空格和标点符号的算法

时间:2015-04-21 02:51:32

标签: string algorithm dictionary data-structures trie

我的数据结构类中遇到了一个问题,就是找到解决这个问题的方法。这与面试问题类似。如果有人能够解释问题的思考过程或解决方案。可以使用伪代码。到目前为止,我一直在考虑使用try来保存字典并查找那些提高效率的单词。

这是问题所在:

哦,不!当您发现不幸的查找/替换事故时,您刚刚完成了一份冗长的文档。您不小心删除了文档中的所有空格,标点符号和大小写。像“我重置计算机。它仍然没有启动!”这样的句子。将成为“iresetthecomputeritstilldidntboot”。一旦你将各个单词正确分开,你就可以计算出以后可以在标点和大写中添加回来。大多数单词都在字典中,但有些字符串,如专有名字,不会。

给定一个字典(一个单词列表),设计一种算法来找到“非复杂化”单词序列的最佳方式。在这种情况下,“最佳”被定义为最小化无法识别的字符序列数的解析。

例如,字符串“jesslookedjustliketimherbrother”将被最佳地解析为“JESS看起来就像TIM她的兄弟”。这个解析有七个无法识别的字符,为了清楚起见,我们已将其大写。

3 个答案:

答案 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)

您可以使用不同长度的滚动哈希来加速搜索。