這種方法有點蠻力,但可能是一個很好的起點。
如果目標單詞等於開始單詞,或者具有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
字典有多大?字典中會有多少單詞? –