【问题标题】:Finding the Sorted Rank of a String查找字符串的排序等级
【发布时间】:2014-04-29 03:31:01
【问题描述】:

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

我见过很多用于生成字符串排列的不同范例,但我无法将它们中的任何一个放在一起来解决这个问题。是否有一个特定的算法至少在某种程度上适合这个?关于如何解决这个问题有什么建议吗?我想自己解决这个问题,但需要一点点才能到达那里。

【问题讨论】:

  • deinstitutionalization 是面试问题的一部分,还是你编造的?我问的原因是重复的字母使这个问题更难解决。
  • @user3386109:相反;重复的字母使问题变得更容易。
  • @swamp56:看来您需要在这个问题上更加精确。您的意思是“所有字母排列列表中的索引”(在这种情况下,每个字母的计数很重要)还是“列表中由同一组字母组成的可能单词的索引”? (在这种情况下,计数不相关)。
  • 我应该找出在给定字母(包括重复)的所有排列列表中该单词存在的位置,因为列表是按字母顺序排序的。我被告知不要生成一个列表,然后在其中搜索那个特定的单词。

标签: algorithm sorting search


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      3. 对于给定的单词,您需要找到该单词在排序结构中的排名。如果你有一个 sortedHashmap 或一个平衡树,你可以轻松做到这一点

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

      【讨论】:

      • 如果我正确理解您的答案,您将需要大约 1 Yottabyte 来保存所有单词,并且您需要等待相当长的时间才能填满那个 yottabyte 的空间。这似乎有点浪费,因为存在只需要恒定空间的 O(n) 解决方案。
      • @NiklasB.,我认为您误解了我的回答。您在哪里认为我为对象保留了太多内存。我需要用于 trie 的内存,每个节点都需要用于映射的内存。一个对象只存储在一个节点上。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      • 2021-09-26
      相关资源
      最近更新 更多