leetcode 高階 單詞接龍

2021-10-01 11:26:34 字數 1900 閱讀 2010

給定兩個單詞(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" 不在字典中,所以無法進行轉換。

典型的廣度優先,

以這張圖為例,其實就是從hit開始一層層往下判斷。

其中圖的頂點就是這些點,相差乙個字母的點相鄰

直接看**就能看懂,但是有個點:

怎麼判斷它相鄰,

想到的暴力辦法:

對單詞的每個字元,從a到z進行替換。如果dic裡有,就可以建成圖,使之相鄰。

另外乙個點是;

使用了雙端搜尋,兩端都hashset,同時hashset效率高

/**

在提交裡看到的最優解,看懂了,解讀一下分享出來:

需要掌握的知識遞進:

1.bfs。

2.雙端bfs。

3.臨近點查詢方式:

首先將所有的字元存到結構為hashset的dic字典裡去,然後將字串的每一位挨個從a變到z,

在變化的時候實時去字典里查,因為是hashset,所以複雜度是o(1),非常快。

如果查到了,則就是找到了臨近點。

*/class

solution

public

intbfs

(hashset

st, hashset

ed, hashset

dic,

int l)

//bfs的標記行為,即使用過的不重複使用

dic.

removeall

(st)

;//收集下一層臨近點

hashset

next =

newhashset

<

>()

;for

(string s : st)

}//復原

arr[i]

= tmp;}}

return

bfs(next, ed, dic, l +1);}}

**參考leetcode

leetcode單詞接龍

借助佇列,存在每一次搜尋的字串 首先將beginword入隊,佇列不為空時,判斷當前佇列的大小,依次取出佇列中的元素,在wordlist中尋找與其差乙個字元的字串,將找到的字串入隊,且wordlist中找到的字串設為空,之後不在搜尋該字串 最短路徑,即找到endword所需的bfs的層數 如下 cl...

leetCode 單詞接龍 BFS

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

LeetCode 127 單詞接龍

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