Algorithm 检查单词是否由一个或多个串联字典单词组成

Algorithm 检查单词是否由一个或多个串联字典单词组成,algorithm,language-agnostic,data-structures,Algorithm,Language Agnostic,Data Structures,以下是场景: 我有一个由数百万个长度为3-32的随机字母串组成的数组,还有一个单词数组(字典) 我需要测试一个随机字符串是否可以通过连接1、2或3个不同的字典单词组成 由于字典中的单词会有点固定,我可以对它们进行任何类型的预处理 理想情况下,我希望通过对字典进行某种预处理来优化查找速度 要实现这一点,我应该考虑什么样的数据结构/算法?将字典字符串存储在散列集数据结构中。遍历要签入1、2或3个部分的字符串的所有可能拆分,并为每个拆分查找哈希集中的所有部分。首先,从dict构建一个类似于B树的Tri

以下是场景:

我有一个由数百万个长度为3-32的随机字母串组成的数组,还有一个单词数组(字典)

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

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

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


要实现这一点,我应该考虑什么样的数据结构/算法?

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

首先,从dict构建一个类似于B树的Trie结构。每个根都将映射到一个字母。然后,每个第二级子树将拥有所有可以由两个字母组成的单词,依此类推

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

  • 制作一个正则表达式来匹配字典中的每个单词
  • 用括号括起来
  • 在末尾放一个
    +
  • 使用任何正确的(基于DFA的)正则表达式引擎编译它

  • 所以可能只有1、2或3个单词(不是更多)?它必须是完整的随机字符串(不仅仅是?@MacGucky的一部分),我可能需要让它支持4个甚至5个单词。是的,它必须是完全匹配的。内存限制是什么?为什么不创建所有可能的组合并存储在trie中呢?谢谢,我更新了我的答案。我忘了这个结构有一个正式的名字。这是由于过分贪婪而失败的。e、 g.如果您的字典包含“FORT”、“四十”和“二”,字符串“FORTYTWO”将与“FORT”匹配,然后递归检查“YTWO”并失败。然后您将回溯并找到四十和二。在证明特定子树中没有更多匹配项之前,搜索没有失败。在这种情况下,FORT子树至少有两个分支需要尝试。您不需要回溯,而是使用适当的DFA。您会使用什么其他类型的DFA来帮助实现这一点,R?