【问题标题】:Checking if a word is made up of one or more concatenated dictionary words检查一个单词是否由一个或多个连接的字典单词组成
【发布时间】:2011-03-22 13:25:43
【问题描述】:

这是场景:

我有数百万个长度为 3-32 的随机字母字符串数组和一个单词数组(字典)。

我需要测试一个随机字符串是否可以通过连接 1、2 或 3 个不同的字典单词来组成。

由于字典单词会有些固定,我可以对它们进行任何类型的预处理。

理想情况下,我希望通过对字典进行某种预处理来优化查找速度。

我应该考虑什么样的数据结构/算法来实现这个?

【问题讨论】:

  • 所以可能只有 1、2 或 3 个字(不能更多)?而且一定是完整的随机字符串(不仅仅是一部分)?
  • @MacGucky,我可能需要让它支持 4 甚至 5 个单词。是的,它必须是完全匹配的。
  • 内存限制是什么?为什么不创建所有可能的组合并存储在 trie 中?

标签: algorithm language-agnostic data-structures


【解决方案1】:

首先,从您的 dict 构建一个 B-Tree like Trie 结构。每个根将映射到一个字母。然后每个第二级子树将包含所有可以用两个字母组成的单词,依此类推。

然后接受你的单词,从第一个字母开始,沿着 B-Tree Trie 走,直到找到匹配项,然后递归地将这个算法应用于单词的其余部分。如果您在任何时候都找不到匹配项,您就知道您无法通过 concats 形成单词。

【讨论】:

  • 谢谢,我更新了我的答案。我忘了这个结构有一个正式的名字。
  • 由于过度贪婪而失败。例如如果您的字典包含“FORT”、“FORTY”和“TWO”,则字符串“FORTYTWO”将匹配“FORT”,然后递归检查“YTWO”并失败。
  • 然后你会回溯并找到四十,然后是两个。直到证明特定子树中没有更多匹配项,搜索才会失败。在这种情况下, FORT 子树至少有两个分支可供尝试。
  • 你不要回溯,你使用适当的 DFA。
  • R,你会使用什么其他类型的 DFA 来帮助解决这个问题?
【解决方案2】:

将字典字符串存储在散列集数据结构中。遍历您要检查的字符串的所有可能拆分 1、2 或 3 个部分,并为每个这样的拆分查找哈希集中的所有部分。

【讨论】:

    【解决方案3】:
    1. 创建一个匹配字典中每个单词的正则表达式。
    2. 用括号括起来。
    3. 在末尾加上+
    4. 使用任何正确的(基于 DFA 的)正则表达式引擎对其进行编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-09
      • 2019-05-29
      • 2015-03-28
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      相关资源
      最近更新 更多