查找字符串的排序等级

时间:2014-04-29 03:31:01

标签: algorithm sorting search

所以我正在研究作为面试问题给我的问题。我还没有完全完成,并且可以使用一些指导来了解如何处理这种算法。它的要点是:你有"字"包含相同字母的相同长度(即读和亲)。所请求的程序将允许您输入您想要的任何单词(例如,"去机构化")并在字母数字排序的所有其他字母的上下文中获取该单词的位置,而无需创建完整的可能性列表。因此,例如,去机构化可能位于可能的"单词"的位置156363363中。 d,e,i,n,s,t,u,o,a,l和z由22个字符组成。

我已经看到很多不同的范例用于生成字符串的排列,但我还没有能够将它们中的任何一个放在一起来解决这个问题。是否有一种特定的算法至少在某种程度上适合于此?对于如何处理这个有什么建议吗?我想自己解决这个问题,但只需要一点点就可以实现。

3 个答案:

答案 0 :(得分:1)

你的提示是these slides的前半部分,我从中提出了两个主要想法。

这两个一般性的想法可能会对你有所帮助,但不会完全解决问题,因为你仍然需要弄清楚如何将你可能重复的字母映射到排名的数字上。

  1. 共享相同第一个元素k的所有排列的排名均为(k-1)(n-1)!k(n − 1)! − 1
  2. 您可以删除第一个元素,以递归方式查找剩余排列的等级。

答案 1 :(得分:1)

字符串的排序等级是小于它的不同排列的数量(或等于它,对于从1开始的等级)。当且仅当P和P'具有共同前缀,然后是P的字母小于P'的对应字母,随后是任意字母时,置换P小于置换P'。我所知道的有效计算置换等级的最简单方法是迭代这个公共前缀的长度,然后迭代替换以减少那里的字母的下一个位置,然后添加剩余后缀的排列数。很容易证明每个较小的排列只计算一次。

我知道这个想法有效,因为我已经实现了它:https://stackoverflow.com/a/22643546/2144669

答案 2 :(得分:0)

我看到你问题的3个子部分

  1. 为单词组合生成哈希码,因此r,e,a,d将具有r,e,a将具有的不同组合。但是他们将拥有与d,e,a和r相同的组合。 因此,您需要在单词中查找唯一元素,对它们进行排序并为此列表创建哈希码。您可以轻松地使用String的哈希码。如果您正在处理生成此单词的单词列表,则它很简单,可以作为Trie实现。但是,如果将它们组合为组合,则非常棘手

  2. 对于每个单词,您必须比较字母并相应地插入它们,您可以使用字符串比较来生成它。您可能需要一个Map,其中key是步骤1中派生的hascode,value是平衡树或地图。

  3. 对于给定的单词,您需要在排序的结构中找到该单词的排名。如果您有sortedHashmap或平衡树,则可以轻松地执行此操作

  4. 我可能会选择trie中的每个节点都有一个平衡树。