【问题标题】:Given a string, find all its permutations that are a word in dictionary给定一个字符串,找到它的所有排列是字典中的一个单词
【发布时间】:2012-01-15 14:31:56
【问题描述】:

这是一道面试题:

给定一个字符串,找出它在字典中的所有排列。

我的解决方案:

将字典中的所有单词放入后缀树中,然后在树中搜索字符串的每个排列。

搜索时间为O(n),其中n是字符串的大小。但字符串可能有n! 排列。

如何提高效率?

【问题讨论】:

  • 此任务的常用名称是查找字谜——您应该能够使用该搜索词找到一种经典方法。

标签: c++ algorithm search data-structures suffix-tree


【解决方案1】:

你应该把这些词放到一个 trie 中。然后,您可以在生成排列时查找该单词。您可以跳过整个排列块,但第一部分不在 trie 中。

http://en.wikipedia.org/wiki/Trie

【讨论】:

    【解决方案2】:

    另一种简单的解决方案可以是下面的算法,

    1) 使用“next_permutation”找到唯一的排列。

    2) 使用“find/find_if”根据字典查找。

    【讨论】:

      【解决方案3】:

      为什么不使用哈希映射来存储字典单词?所以你得到 O(1) 的查找时间。如果你的输入是英文,你可以建立另一个表来告诉你字典中所有可能的字母,使用这个表,你可以在开头过滤一些输入。下面是一个例子:

      result_list = empty;   
      
      for(char in input)
      {
         if(char not in letter_table)
         {
            return result_list;
         }
      }
      
      for(entry in permutations of input)
      {
          if(entry in dictionary_hash_table)
          { 
              result_list->add_entry();
          }
      }
      
      return result_list
      

      【讨论】:

        【解决方案4】:

        你的一般方法还不错。

        但是,您可以通过重新排列单词以使其所有字符都按字母顺序排列,然后在字典中搜索,其中每个单词同样按字母顺序重新排列并映射到原始单词,从而避免搜索每个排列.

        我意识到这可能有点难以理解,所以这里有一个例子。说你的话是飞跃。将其重新排列为 aelp

        现在,您的字典中可能会有 pleapale 这两个词。按照建议完成后,您的字典将(除其他外)包含以下映射:

        ...
        aelp -> pale
        aelp -> plea
        ...
        

        所以现在,要找到您的字谜,您只需要找到 aelp 的条目(例如,使用建议的后缀树方法),而不是全部 4 个! = 跳跃的 24 种排列。

        【讨论】:

        • 这是我为你分析的想法。对字典中的每个单词进行排序。 O(n * m * lg m),n是字典的大小,m是单词的平均长度将每对放入一个hashmap。如果 key 冲突,将未排序的单词放入 list。这个 O(n)。对给定的字符串进行排序,O( p lg p),p 是字符串的大小。在哈希图中搜索已排序的字符串(一个字谜)。 O(1)。字谜的键列表是所有排列。所以,完全是 O(n * m * lg m + p lg p),通常是 p
        【解决方案5】:

        您可以构建从排序的字符列表到单词列表的映射。

        例如,给定这些:

        Array (him, hip, his, hit, hob, hoc, hod, hoe, hog, hon, hop, hos, hot)
        

        您可以在内部对它们进行排序:

         Array (him, hip, his, hit, bho, cho, dho, eho, gho, hno, hop, hos, hot)
        

        排序结果:

         Array (bho, cho, dho, eho, gho, him, hip, his, hit, hno, hop, hos, hot)
        

        在这个小样本中,我们没有匹配项,但对于特定的单词,您可以在内部对其进行排序,并以此为关键字查看您的地图。

        【讨论】:

          【解决方案6】:

          一种快速的替代解决方案 - 完全取决于相关数据结构的大小。

          如果字典相当小并且字符串相当长,您可以检查字典中的每个条目并确定它们是否是字符串的排列。你可以更聪明——你可以对字典进行排序并跳过某些条目。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-02-17
            • 2014-10-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-31
            • 1970-01-01
            • 2020-02-15
            相关资源
            最近更新 更多