leetcode筆記 127單詞接龍

2021-09-08 03:08:56 字數 1638 閱讀 2610

題目:

給定兩個單詞(beginword 和 endword)和乙個字典,找到從 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" 不在字典中,所以無法進行轉換。

思路是使用廣度優先搜尋。是單源頭廣度優先搜尋最短路徑。以開始單詞為圖的源點,當字典中的單詞和源頭相差乙個字母時,將兩個節點鏈結起來,這樣就組成了一幅圖。那麼根據廣度優先搜尋的步驟,構建乙個佇列,之後先把源頂點加入佇列,以佇列是否為空作為條件開始迴圈:如果佇列不為空,逐個取出佇列中的頂點,並把它們標記為「已訪問」。對於每個取出的頂點,依次把它未訪問的頂點加入佇列,直到找到目標頂點或者所有頂點都訪問完畢。因為此題只是求最短路徑的長度,而不是路徑上都有哪些頂點,所以只需要儲存每訪問乙個頂點時該頂點處在路徑的位置即可。這裡我用了hashmap。如果是需要儲存最短路徑本身,那麼需要建立資料結構依次儲存每個頂點的前驅,並在最後追溯前驅獲得路徑上的所有頂點。

**:

class solution }}

}return 0;

}}

執行最快的**:

執行最快的**好像也是廣度優先搜尋,但是和上面的實現方法不一樣。有點看不懂。。。。。

class solution 

if (!dict.contains(endword))

//建立頭尾佇列

setbeginset=new hashset<>();

setendset=new hashset<>();

beginset.add(beginword);

endset.add(endword);

int level=0;

//遍歷佇列

while (!beginset.isempty()&&!endset.isempty())

//建立乙個臨時集合

settemp=new hashset<>();

for (string word : beginset)

if (dict.contains(s))

}chars[i]=ch; }}

beginset=temp;

}return 0;

}}

LeetCode刷題筆記 127 單詞接龍

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

LeetCode 127 單詞接龍

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

Leetcode 127單詞接龍

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