Python 如何对一个编辑距离的字符串进行分组

Python 如何对一个编辑距离的字符串进行分组,python,algorithm,Python,Algorithm,我有一个字符串列表,例如: arr1 = ["ABC", "ABD", "ABCD", "ABCE", "ACCE", "AB"] 我想将这些字符串分组到子列表中,这样每个子列表将只包含x编辑距离以外的字符串。例如,可以通过将一个字母替换为其他字母来找到1-edit-distance字符串。因此,对于上面的列表,我想制作: arr2 = [["ABC", "ABD"], ["ABCD", "ABCE", "ACCE"], ["AB"]] 文献中有解决这个问题的算法吗?解决这个问题的有效方法是

我有一个字符串列表,例如:

arr1 = ["ABC", "ABD", "ABCD", "ABCE", "ACCE", "AB"]
我想将这些字符串分组到子列表中,这样每个子列表将只包含x编辑距离以外的字符串。例如,可以通过将一个字母替换为其他字母来找到1-edit-distance字符串。因此,对于上面的列表,我想制作:

arr2 = [["ABC", "ABD"], ["ABCD", "ABCE", "ACCE"], ["AB"]]
文献中有解决这个问题的算法吗?解决这个问题的有效方法是什么


编辑:我定义的编辑距离有点不同,因为:如果x=1,只允许替换x个字母,只允许1个字母不同,不能进行添加或删除

您的示例所暗示的算法可能最终不是您所寻找的算法,但它肯定是可能的:

editdist = lambda a, b: sum(0 if c1 == c2 else 1 for (c1, c2) in zip(a, b))
a = ["ABC", "ABD", "ABCD", "ABCE", "ACCE", "AB"]
a = list(reversed(a))
ret = []
while a:
    s = a.pop()
    for sublist in ret:
        if len(sublist[-1]) == len(s) and editdist(sublist[-1], s) == 1:
            sublist.append(s)
            s = None
            break
    if s: ret.append([s])
print ret

该代码假定您希望得到问题的结果:字符串序列,以便序列中的每个字符串与前后的字符串之间都有一个编辑距离。

您可以使用每个字符串作为顶点来构建图形。当对应的字符串距离x编辑距离时,两个顶点之间有一条边。现在,只需运行DFS遍历即可获得所需的分组


如果你需要更多的细节,请告诉我

我能想到的唯一一件事是在双循环上迭代,其中对于内循环中的每个项目,我一次更改一个字符并与外循环中的值进行比较,但显然这不是一种聪明/有效的方法。由于一个编辑距离不是可传递的属性,因此问题没有得到很好的定义。arr1=[ABC、ABD、EBC]的预期输出是什么?无论如何,不是两个嵌套循环使用arr1上的一个循环和一个集合来执行查找,而是让您从^2转到log n。我可能遗漏了一些内容,但这不只是根据单词的长度对单词进行分组吗?如果我只能做一次编辑,这意味着我要么洗牌字母长度保持不变,要么添加或删除字母,在这种情况下,长度将被更改-因此只有那些相同长度的其他单词将具有相同的编辑顺序,对吗?你能更精确地定义编辑距离吗。例如,你想要Levenshtein距离吗?如果一个集合的分区比排列多,那么你就不能比对数n更好,对吗?