給定兩個單詞(beginword 和 endword)和乙個字典 wordlist,找出所有從 beginword 到 endword 的最短轉換序列。轉換需遵循如下規則:
每次轉換只能改變乙個字母。
轉換過程中的中間單詞必須是字典中的單詞。
說明:
如果不存在這樣的轉換序列,返回乙個空列表。
所有單詞具有相同的長度。
所有單詞只由小寫字母組成。
字典中不存在重複的單詞。
你可以假設 beginword 和 endword 是非空的,且二者不相同。
示例 1:
輸入:beginword = 「hit」,
endword = 「cog」,
wordlist = [「hot」,「dot」,「dog」,「lot」,「log」,「cog」]
輸出:[
[「hit」,「hot」,「dot」,「dog」,「cog」],
[「hit」,「hot」,「lot」,「log」,「cog」]
]示例 2:
輸入:beginword = 「hit」
endword = 「cog」
wordlist = [「hot」,「dot」,「dog」,「lot」,「log」]
輸出:
解釋: endword 「cog」 不在字典中,所以不存在符合要求的轉換序列。
const
int inf =
1<<20;
class
solution
}//建立word-id(unordered_map)對映以及id-word對映(vector)if(
!wordid.
count
(endword));
}//不存在目標單詞,返回空if(
!wordid.
count
(beginword)
)//新增起始單詞
edges.
resize
(idword.
size()
);//edges[i][j]表示id為i與j的單詞之間有邊(只差乙個字母))
for(
int i =
0; i < idword.
size()
; i++)}
}//建立edges二維矩陣
const
int dest = wordid[endword]
;//dest為目標單詞的id
vector> res;
//變化的單詞路徑
queueint>> q;
//bfs的佇列
vector<
int>
cost
(id, inf)
;//cost[i] 表示 beginword 對應的點到第 i 個點的代價(即轉換次數)。
//初始情況下其所有元素初始化為無窮大。
//所有的單詞耗費初始化為無限遠
q.push
(vector<
int>);
//佇列放入起始單詞
cost[wordid[beginword]]=
0;while
(!q.
empty()
) res.
push_back
(tmp);}
else}}
}return res;
}bool
transformcheck
(const string& str1,
const string& str2)
}return differences ==1;
}};
leetcode官方題解鏈結 leetcode 126 單詞接龍2
給定兩個單詞 beginword 和 endword 和乙個字典 wordlist,找出所有從 beginword 到 endword 的最短轉換序列。轉換需遵循如下規則 每次轉換只能改變乙個字母。轉換過程中的中間單詞必須是字典中的單詞。說明 示例 1 輸入 beginword hit endwor...
Leetcode126單詞接龍II C
思路 參考 中的每一步都按我自己的理解進行注釋了。class solution 存放動態的路徑,這裡不一定是滿足條件的路徑,這樣可以一直去除最後乙個詞進行比較 queue paths 指定路徑的開頭 paths.push p 存放已經迴圈過的單詞。unordered setwords 分別記錄當前路...
126 單詞接龍 II
題目.high 這其實就是圖的演算法,dijkstra演算法 這道題,先求直達的最小路徑,這個用bfs沒啥好說的,一般求路徑的問題就是要用dfs,可是不需要求所有的到達路徑,也不需要求隨意的一條到達路徑,不然dfs準沒錯。所以我們還是要用bfs,不過在bfs的時候,把經過的所有節點都求出從開始到他這...