Lintcode121 Word Ladder || solution 題解

【題目描述】

Given two words (startandend), and a dictionary, find all shortest transformation sequence(s) fromstarttoend, such that:

1.Only one letter can be changed at a time

2.Each intermediate word must exist in the dictionary

給出兩個單詞(start和end)和一個字典,找出所有從start到end的最短轉換序列

比如:

1.每次只能改變一個字母。

2.變換過程中的中間單詞必須在字典中出現。

【注】

·所有單詞具有相同的長度。

·所有單詞都只包含小寫字母。

【題目鏈接】

www.lintcode.com/en/problem/word-ladder-ii/

【題目解析】

本題主要的框架和上一題是一樣,但是還要解決兩個額外的問題:

1.怎樣保證求得所有的最短路徑

2.怎樣構造這些路徑

第一問題:

不能像上一題第二點注意那樣,找到一個單詞相鄰的單詞後就立馬把它從字典裏刪除,因爲當前層還有其他單詞可能和該單詞是相鄰的,這也是一條最短路徑,比如hot->hog->dog->dig和hot->dot->dog->dig,找到hog的相鄰dog後不能立馬刪除,因爲和hog同一層的單詞dot的相鄰也是dog,兩者均是一條最短路徑。但是爲了避免進入死循環,再hog、dot這一層的單詞便利完成後dog還是得從字典中刪除。即等到當前層所有單詞遍歷完後,和他們相鄰且在字典中的單詞要從字典中刪除。 如果像上面那樣沒有立馬刪除相鄰單詞,就有可能把同一個單詞加入bfs隊列中,這樣就會有很多的重複計算(比如上面例子提到的dog就會被2次加入隊列)。因此我們用一個哈希表來保證加入隊列中的單詞不會重複,哈希表在每一層遍歷完清空(代碼中hashtable)。 當某一層的某個單詞轉換可以得到end單詞時,表示已經找到一條最短路徑,那麼該單詞的其他轉換就可以跳過。並且遍歷完這一層以後就可以跳出循環,因爲再往下遍歷,肯定會超過最短路徑長度

第二個問題:

爲了輸出最短路徑,我們就要在比bfs的過程中保存好前驅節點,比如單詞hog通過一次變換可以得到hot,那麼hot的前驅節點就包含hog,每個單詞的前驅節點有可能不止一個,那麼每個單詞就需要一個數組來保存前驅節點。爲了快速查找因此我們使用哈希表來保存所有單詞的前驅路徑,哈希表的key是單詞,value是單詞數組.

有了上面的前驅路徑,可以從目標單詞開始遞歸的構造所有最短路徑

【參考答案】

www.jiuzhang.com/solutions/word-ladder-ii/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章