从没有空格和标点符号的字符串中取消连接单词的算法
Algorithm to un-concatenate words from string without spaces and punctuation
我的数据结构出现了问题class,我想找到解决这个问题的方法。这类似于面试问题。如果有人可以解释问题的思考过程或解决方案。可以使用伪代码。到目前为止,我一直在考虑使用 tries 来保存字典并以这种方式查找单词以提高效率。
这是问题所在:
哦,不!当您遇到不幸的 Find/Replace 事故时,您刚刚完成了一份冗长的文档。您不小心删除了文档中的所有空格、标点符号和大写字母。像 "I reset the computer. It still didn't boot!" 这样的句子会变成 "iresetthecomputeritstilldidntboot"。您认为一旦正确分隔了各个单词,您就可以稍后重新添加标点符号和大写字母。大多数单词会在字典中,但一些字符串,如专有名词,不会。
给定一个字典(单词列表),设计一个算法来找到 "unconcatenating" 单词序列的最佳方式。在这种情况下,"optimal" 被定义为最小化无法识别的字符序列数的解析。
例如,字符串 "jesslookedjustliketimherbrother" 将被最佳解析为 "JESS looked just like TIM her brother"。此解析有七个无法识别的字符,为清楚起见,我们将其大写。
对于字符串中的每个索引 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) 的 table 从末尾开始向后。
如果字典中最长单词的长度是 L,那么算法在最坏情况下的运行时间为 O(NL),如果小心的话,可以实现为使用 O(L) 内存。
您可以尝试部分模式匹配器,例如 aho-corasick 算法。基本上它是后缀树的特殊 space 优化版本。
您可以使用不同长度的滚动哈希来加快搜索速度。
我的数据结构出现了问题class,我想找到解决这个问题的方法。这类似于面试问题。如果有人可以解释问题的思考过程或解决方案。可以使用伪代码。到目前为止,我一直在考虑使用 tries 来保存字典并以这种方式查找单词以提高效率。
这是问题所在:
哦,不!当您遇到不幸的 Find/Replace 事故时,您刚刚完成了一份冗长的文档。您不小心删除了文档中的所有空格、标点符号和大写字母。像 "I reset the computer. It still didn't boot!" 这样的句子会变成 "iresetthecomputeritstilldidntboot"。您认为一旦正确分隔了各个单词,您就可以稍后重新添加标点符号和大写字母。大多数单词会在字典中,但一些字符串,如专有名词,不会。
给定一个字典(单词列表),设计一个算法来找到 "unconcatenating" 单词序列的最佳方式。在这种情况下,"optimal" 被定义为最小化无法识别的字符序列数的解析。
例如,字符串 "jesslookedjustliketimherbrother" 将被最佳解析为 "JESS looked just like TIM her brother"。此解析有七个无法识别的字符,为清楚起见,我们将其大写。
对于字符串中的每个索引 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) 的 table 从末尾开始向后。
如果字典中最长单词的长度是 L,那么算法在最坏情况下的运行时间为 O(NL),如果小心的话,可以实现为使用 O(L) 内存。
您可以尝试部分模式匹配器,例如 aho-corasick 算法。基本上它是后缀树的特殊 space 优化版本。
您可以使用不同长度的滚动哈希来加快搜索速度。