假设我有一个类似的字符串列表。我想弄清楚所有这些字符串的共同部分或特征。有没有一种已知的方法可以找出一个与给定集合中所有字符串最相似的字符串,并且不属于该集合?
例如,如果我有以下设置:
Hello
Hell
Help
Hepl
'赫尔'给出levenshtein距离2,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