最短字符串,其中字符串集的编辑距离最短

时间:2017-03-08 19:45:06

标签: string algorithm levenshtein-distance

假设我有一个类似的字符串列表。我想弄清楚所有这些字符串的共同部分或特征。有没有一种已知的方法可以找出一个与给定集合中所有字符串最相似的字符串,并且不属于该集合?

例如,如果我有以下设置:

Hello
Hell
Help
Hepl

'赫尔'给出levenshtein距离2,1,1,1。目前我正在考虑将不同的子串作为基础,并计算距离(我的集合相当小,因此粗暴强制不会成为问题),但是此解决方案找不到字符串,这些字符串本质上不是任何给定字符串的子字符串。设置,但可能是最佳解决方案(例如解决方案是两个子串的共轭的情况)。

任何关于此的线索都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

你说蛮力是可以接受的:-)。那么经典的方法是广泛的第一次搜索。对于列表中的每个字符串,您将生成编辑距离为1的所有字符串,而不是距离2字符串的所有字符串,依此类推。对于每个给定的字符串,您将获得一个变异字符串树。在每一轮(距离)之后,检查每棵树是否有共同的字符串。

levenshtein距离的伪代码:

alphabet = "abcd..."
starters = "Hello", "Hell", "Help", "Hepl"
relatives = set()
distance = 0
for word in starters
    trees[word][distance] = word

while len(relatives) == 0
    distance++
    for tree in trees
        for word in tree[distance-1]
            for pos in range(len(word))
                new_word = word.erase(pos)
                if new_word not in tree
                    tree[distance].insert(new_word)
                    dict[new_word] += 1
                    if dict[new_word] == len(starters)
                        relatives.insert(new_word)
            for pos in range(len(word))
                for letter in alphabet
                    new_word = word.replace(pos, letter)
                    if new_word not in tree:
                        tree[distance].insert(new_word)
                        dict[new_word] += 1
                        if dict[new_word] == len(starters)
                            relatives.insert(new_word)
            for pos in range(len(word) + 1):
                for letter in alphabet
                    new_word = word.insert(pos, letter)
                    if new_word not in tree
                        tree[distance].insert(new_word)
                        dict[new_word] += 1
                        if dict[new_word] == len(starters)
                            relatives.insert(new_word)
print relatives