将所有字谜组合在一起[关闭]
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 点;-)。由于单词通常很短,因此“按字母排序”步骤确实很便宜!-)以上是关于将所有字谜组合在一起[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
一种可能的算法来确定两个字符串是不是是彼此的字谜? [关闭]