給定兩個單詞(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的規模給到了上千,每...