【问题标题】:anagram algorithm字谜算法
【发布时间】:2011-11-03 11:13:42
【问题描述】:

这是为文本生成字谜的最佳方式(最多 80 个字符长度)。 例子: 输入:狗 输出dog dgo odg ogd gdo god

我只是想一个回溯的解决方案,但如果文本较长,这将需要一段时间。

另一个想法是构建我尝试字典中的所有单词,但问题并不要求真正的单词。

有人能指出最小时间复杂度的解决方案吗?

谢谢!

【问题讨论】:

  • 它类似于建立排列的字典顺序。数字指的是索引器。
  • 如果不是,请说明实际需求。我有兴趣!
  • @Fredrik,如果是这样,为什么重要?无论哪种方式,他都想学习一些东西。
  • @Filip:如果是家庭作业,最好提供指针而不是解决方案。
  • 在这个 SO 问题上有一些讨论:Algorithm to generate anagrams

标签: c# algorithm anagram


【解决方案1】:

这是一个简单的实现,以防万一您需要:

IEnumerable<List<T>> Permutations<T>(List<T> items)
{
    if (items.Count == 0) yield return new List<T>();

    var copy = new List<T>(items);
    foreach (var i in items)
    {
        copy.Remove(i);
        foreach (var rest in Permutations(copy))
        {
            rest.Insert(0, i);
            yield return rest;
        }
        copy.Insert(0, i);
    }

}

IEnumerable<string> Anagrams(string word)
{
    return Permutations(word.ToCharArray().ToList()).Select(x => new String(x.ToArray()));
}

关于时间复杂性的答案给了 Adithya。要了解他们的答案,您必须知道有 n! = n 项的 1*2*...*n 排列。我的算法就是一个证明(或基于直接证明)

【讨论】:

    【解决方案2】:

    这个问题看起来像是生成排列列表; (字谜是排列的子集,形成一个有意义的词)。嗯!可以使用 STL 的next_permutation 的方法按时间顺序生成排列,(每个排列的线性时间复杂度);你可以在这里找到这个算法的讨论:http://marknelson.us/2002/03/01/next-permutation/; STL 的算法甚至可以处理重复,在这种情况下,朴素的交换算法会失败。

    有关生成排列的深入讨论,您可以浏览 TAOCP 的 Donald Knuth 的 Generating all Perumutations 部分。

    【讨论】:

      【解决方案3】:

      回溯是最快的方法,当你想要一个文本的所有字谜时,这意味着你需要所有的 n!它的排列。因此,假设打印/生成每个排列至少需要 O(1),那么无论如何您的算法都需要 O(n!),因此您不能比回溯解决方案更快。

      【讨论】:

      • 是的,O(80!)...几年!
      • 当输入字符串包含相同的字母时会发生什么:例如:input:aba 输出应该是:aab aba baa。我不需要重复。我是否必须将当前结果与所有 previos 结果进行比较以避免重复?
      • 您可能有一个包含已发现排列的哈希,或者如果有太多重复项,您可以构建一个 trie,但在这里要小心一点。每个节点都有一个映射到其剩余出现次数的字符哈希映射,使用这些字符生成子节点,并在其哈希映射中递减子节点字符的计数器,如果计数为 0,则删除键。根将所有唯一字符作为键映射到它们的出现次数,叶子将有一个空映射。现在为您的解决方案打印所有到叶子的路径。如果所有字符都相同,则需要 O(n)。
      • @Dan Dinu 将所有结果存储在 Hashtable 中,因此检查将是 O(1)
      猜你喜欢
      • 2011-01-17
      • 2012-11-21
      • 2012-05-25
      • 2010-09-08
      • 2012-11-22
      • 2021-04-21
      • 2010-12-01
      • 2013-05-20
      • 2012-11-03
      相关资源
      最近更新 更多