给你一组单词,例如
{ aaa, aab, cab }, { ded, def, dec }
您需要将每个单词添加到一个组中。如果出现以下情况,可以将一个单词添加到组中:
- 这是该组中唯一的一个词
- 组中至少还有一个其他单词距离给定单词最多1个编辑距离。
醇>您的函数必须返回可以使用所有给定单词形成的最小可能数量的组。
示例,对于给定的输入字符串,组将如下所示:
distance(aaa, aab)
说明:
distance(aab, cab)
为1,因此它们属于同一组。此外,cad, ced
也是1,因此它们也属于同一组。但是第二组中的任何单词与第一组中的任何其他单词的编辑距离均为1,但与其自己组中的至少一个其他单词的编辑距离为1。如果除了示例中的单词之外还给了两个单词,让我们说
distance(cab, cad)
,那么答案将变为1,因为现在distance(cad, ced)
是1,因此cad在组中1和clear:both
是1,所以ced在组1中。另外,距离(ded,ced)是1,所以第二组将与第一组“连接”,因此我们只剩1基。我们只对群组数感兴趣,而不是群组本身。
约束:所有单词的长度都相同,但该长度不固定且可能很大。
我只能想出O(mn ^ 2),其中m是任何单词的长度,n是单词的数量。这是使用图形方法(每个单词作为节点和具有编辑距离1的单词作为相邻节点)。
预期的解决方案是O(mn)。
答案 0 :(得分:1)
找到一个解决方案,它是此处接受的解决方案的扩展: Efficiently build a graph of words with given Hamming distance
基本上,我们的想法是将字符串存储在Set中,其中查找和删除平均为O(1)。将它们放入集合意味着我们将覆盖编辑距离为0的字符串,即相等的字符串。但我们无论如何都不关心他们,因为他们总是在同一个群体中。
解释为什么会这样做:
我们只遍历每个节点一次并将其从集合中删除。在我们从集合中删除字符串之后,我们还递归地删除集合中的任何项目"相邻"它。但只有递归中的第一个节点被添加到起始节点列表中。
在我们的示例中,ded将被添加到节点列表并且dec,def将被删除。然后将aaa添加到节点列表中并删除aab。在移除aab的同时,也会移除cab。返回的答案是2。
时间复杂度:
O(mnC)其中C是字符集的大小,m是字符串的长度,n是字符串的数量。
对字符串中的每个字符进行C次替换m次。对字符串集中的每个项目执行一次。