【问题标题】:How to find words in a table?如何在表格中查找单词?
【发布时间】:2012-01-15 19:06:42
【问题描述】:

这是一个编码练习。假设有一个字母表和一些单词。我必须在表格中找到单词的位置。一个单词可以在表格中的任何位置开始,并且可以垂直或水平定向。 (我们可以假设一行/列可能只包含一个单词)。

例如:

表 = xabcx xxxdx xxfex 词= [“abc”,“edc”,“fe”] 预期输出为 (0,1), (2,3), (2,2)

直接的解决方案是遍历所有行/列并检查每行/列是否包含任何单词。它需要O(number of columns * number of rows * number of words * word length)。有更好的解决方案吗?也许我应该预处理单词列表以构建更有效的数据结构?

【问题讨论】:

    标签: string algorithm language-agnostic data-structures


    【解决方案1】:

    您可以使用 Trie 数据结构来存储表。有了 Trie 后,查找单词就非常容易了。

    【讨论】:

      【解决方案2】:

      我建议表采用二叉树结构。这基本上是大多数主要的关系数据库系统无论如何都使用的。在这种情况下,您可以根据从单词创建的一些整数哈希码来平衡树。然后在搜索时,根据搜索词创建一个哈希,并智能地遍历你的树,直到找到匹配的行。

      【讨论】:

        【解决方案3】:

        这是一个简单的方法。

        您只是在寻找完全匹配,所以我认为您应该立即考虑基于哈希的算法,而不是基于树的算法。首先考虑一个哈希映射,它将字母表中的每个字母与其在表中的位置相关联。现在对于每个单词,您查看第一个字母,然后遍历表(左、右、上、下)以查看整个单词是否存在。

        您可以对此进行改进,改为为每个方向(左、右、上、下)的每两个字母组合(仅 676 个键)创建一个哈希映射。现在,您首先检查单词的前两个字母,哈希图立即为您提供这两个字母存在的位置。您现在可以继续朝该方向查看表格,以查看单词是否完成。或者-您可以取单词的下两个字母,看看是否有该字母对的位置与第一个字母对相邻并且具有相同的方向。

        您可以进一步改进...通过考虑每个方向的每三个字母组合的哈希映射。根据平均字长等启发式方法,您应该能够在存储需求和性能之间找到一个很好的平衡点。

        【讨论】:

          【解决方案4】:

          在每一列/行上使用Aho–Corasick string matching algorithm 只需O(number of columns * number of rows + length of patterns + number of output matches)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多