将所有字谜组合在一起[关闭]

Posted

技术标签:

【中文标题】将所有字谜组合在一起[关闭]【英文标题】:Group together all the anagrams [closed] 【发布时间】:2011-04-08 06:05:49 【问题描述】:

问题陈述: 给定一组 k 个字符串,每个长度为 n。您必须一起输出这组字谜。字谜就像例如 atm - mat , like-kile。

【问题讨论】:

您的问题是……或者您的网名是否表明您希望如何得到回答? :) 参考这个***.com/questions/396005/… 顺便说一句,作业或面试问题?如果你标记得当,你总是可以让其他人更容易在表单 内容中提供最相关的帮助!-) 【参考方案1】:

只需对单词的字母进行排序即可获得特定于字谜的签名。例如,在 Python 中,

sig = ''.join(sorted(word))

并创建一个dict,其中sig 作为键,值是具有该签名的单词列表(defaultdict(list) 非常适用于此)。当然,您可以使用任何具有排序能力的语言,以及其值可以是列表或向量的关联数组;-)。

【讨论】:

在 C# 中:myStrings.ToLookup(str => new string(str.OrderBy(c => c).ToArray())); @Alex :使用所有这些排序技术将占用更多的空间和时间复杂度。有什么优雅的解决方案,不需要对它们进行排序,然后将每个与其他所有匹配。??? @Silver Spoon:我相信 Alex 的解决方案具有时间复杂性 O(k * n * log(n))。这已经很不错了。我不相信你可以理论上做得更好O(k * n),即使要接近它,你也必须添加更多假设。 @Silver,在我的方法中绝对没有“将每个与所有其他匹配” - 这就是dict(或hashmap或其他关联数组数据结构),将单词签名映射到具有该签名的单词列表,这就是全部。 如果你有一个 good 散列函数(从单词到单词签名)独立于单词中的字母顺序,并且以某种方式保证(a)永远不会映射两个同一签名 的非字谜(为了性能)(b)不会产生“太多”的意外哈希巧合(不是微不足道的!-),您当然可以跳过按字母排序步骤。 @Ani,我认为唯一需要的“额外假设”是关于拥有那个“梦想哈希函数”的假设(但我认为这是一个大问题,因为我不知道这样一个函数 没有严重违反我之前评论中的 a 和 b 点;-)。由于单词通常很短,因此“按字母排序”步骤确实很便宜!-)

以上是关于将所有字谜组合在一起[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 字谜求解器 [关闭]

字谜Python 3 [关闭]

在给定的字符串列表中查找字符串的所有字谜

一种可能的算法来确定两个字符串是不是是彼此的字谜? [关闭]

您将如何处理 PHP + MySQL 字谜求解器? [关闭]

有效地分组字谜