leetcode 127 單詞接龍

2021-10-02 06:20:16 字數 1825 閱讀 4969

給定兩個單詞(beginword 和 endword)和乙個字典,找到從 beginword 到 endword 的最短轉換序列的長度。轉換需遵循如下規則:

每次轉換只能改變乙個字母。

轉換過程中的中間單詞必須是字典中的單詞。

說明:

如果不存在這樣的轉換序列,返回 0。

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

所有單詞只由小寫字母組成。

字典中不存在重複的單詞。

你可以假設 beginword 和 endword 是非空的,且二者不相同。

示例 1:

輸入:beginword = 「hit」,

endword = 「cog」,

wordlist = [「hot」,「dot」,「dog」,「lot」,「log」,「cog」]

輸出: 5

解釋: 乙個最短轉換序列是 「hit」 -> 「hot」 -> 「dot」 -> 「dog」 -> 「cog」,

返回它的長度 5。

示例 2:

輸入:beginword = 「hit」

endword = 「cog」

wordlist = [「hot」,「dot」,「dog」,「lot」,「log」]

輸出: 0

解釋: endword 「cog」 不在字典中,所以無法進行轉換。

初見這一題,肯定很懵逼。

我們可以把這一題抽象為一道無向無權圖中尋找最短距離的題目

每乙個單詞,抽象為乙個圖中的點。

如果乙個單詞進行一次轉換就可以成為另乙個單詞表中存在的單詞,那麼這兩個單詞在圖中就是相連的。

例如對於例1中的單詞,便可以抽象為這樣乙個無向無權圖

而對於這樣乙個問題,初步學過演算法的人都知道需要進行廣度優先搜尋bfs。

因此使用bfs就可以解決問題。

但是直接使用bfs搜尋會出現超時錯誤,因為bfs搜尋就像二叉樹,隨著層次的增加,搜尋的時間是以2n增長。

這裡使用雙層bfs搜尋,從起始點與目標點,同時開始bfs搜尋,如果兩次搜尋同時達到了同乙個點,則代表兩次搜尋存在交集,即存在從起點到終點的一條通路。

class

solution

;//兩個佇列,從兩端同時開始bfs搜尋

queue q1, q2;

//分別統計兩邊搜尋的層次數

int ans1 =

0, ans2 =0;

//兩個set分別統計每乙個bfs搜尋的遍歷情況

unordered_set s1

, s2

;//把vector轉換為set,提公升速度

unordered_set

word

(wordlist.

begin()

, wordlist.

end())

;//初始化佇列,確定起點

q1.push

(beginword)

; q2.

push

(endword)

;//兩個輔助變數

string tmpa;

string tmpb;

while

(!q1.

empty()

||!q2.

empty()

)}}}

//反向搜尋的情況與上文基本相同

else}}

}}return0;}};

LeetCode 127 單詞接龍

解題思路 1 這道題要找乙個最短路徑,可以聯想到圖的相關演算法 雖然我當時沒想到 那麼是不是應該使用最短路徑的相關演算法呢。其實不用 因為這個圖里每條邊的長度都是1,用乙個廣度優先演算法就搞定了。2規模的問題,如果你遍歷list裡的每個單詞的話,你會發現一直超時,因為有的list的規模給到了上千,每...

Leetcode 127單詞接龍

給定兩個單詞 beginword 和 endword 和乙個字典,找到從 beginword 到 endword 的最短轉換序列的長度。轉換需遵循如下規則 每次轉換只能改變乙個字母。轉換過程中的中間單詞必須是字典中的單詞。說明 示例 1 輸入 beginword hit endword cog wo...

Leetcode 127 單詞接龍

給定兩個單詞 beginword 和 endword 和乙個字典,找到從 beginword 到 endword 的最短轉換序列的長度。轉換需遵循如下規則 每次轉換只能改變乙個字母。轉換過程中的中間單詞必須是字典中的單詞。說明 如果不存在這樣的轉換序列,返回 0。所有單詞具有相同的長度。所有單詞只由...