这种方法有点蛮力,但可能是一个很好的起点。
如果目标单词等于开始单词,或者具有Levenshtein distance 1结果为[start, target]
并且您完成了。
否则,您必须从开始单词中找到Levenshtein距离为1的字典的所有成员。如果其中一个Levenshtein与目标词的距离为1,则结果为[start, word, target]
,您就完成了。否则,您将所选列表中的每个单词作为开始,并将目标作为目标,并将start
预设为最短结果。
伪码 - 有点儿蟒蛇像:
myDict = {"hil", "hol", "hot", "lot", "lit", "lil"}
used_wordlist = {}
shortestWordLadder(start, target):
if start == target or levenshtein(start, target) = 1:
return [start, target]
current_wordlist = [x for x in myDict
if x not in used_wordlist and
levenshtein(ladder[-1], x) = 1]
if current_wordlist.size = 0:
return null
for word in current_wordlist:
if levenshtein(word, target) == 1:
return [start, word, target]
used_wordlist.insert_all(current_wordlist)
min_ladder_size = MAX_INT
min_ladder = null
for word in currrent_wordlist:
ladder = shortestWordLadder(word, target)
if ladder is not null and ladder.size < min_ladder_size:
min_ladder_size = ladder.size
min_ladder = ladder.prepend(start)
return min_ladder
可能的优化:
我认为重用矩阵,即levenshtein(start, target)
将在内部创建,但我无法获得足够的信心,这它会在所有情况下工作。这个想法是从矩阵的右下方开始,选择最小的邻居,从字典中创建一个单词。然后继续那个位置。如果没有当前单元格的邻居从字典中创建一个单词,我们必须回溯,直到我们找到通向值为0的字段的路。如果回溯将我们带回到右下单元格,则没有解决方案。
我不确定现在可能没有解决方案,您可能会忽略这种方式。如果它找到了解决方案,我相当有信心,它是最短的一个。
目前我没有时间思考。如果证明这不是一个完整的解决方案,则可以将其用作优化步骤而不是shortestWOrdLadder()
第一行中的levenshtein(start, target)
呼叫,因为该算法为您提供了Levenshtein距离以及可能的最短路径。
听起来很像一个旅行商问题,我不能想象有一个解决方案,而不是蛮力,如果你找到一个很好的算法回答你自己的问题 – pm100
你读过关于Levenshtein距离吗? – Slava
字典有多大?字典中会有多少单词? –