【題目描述】
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/