LeetCode126:Word Ladder
题目:
Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such that:
- Only one letter can be changed at a time
- Each intermediate word must exist in the dictionary
For example,
Given:
start = "hit"
end = "cog"
dict = ["hot","dot","dog","lot","log"]
As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog"
,
return its length 5
.
Note:
- Return 0 if there is no such transformation sequence.
- All words have the same length.
- All words contain only lowercase alphabetic characters.
- 解题思路:
- 这题一开始没啥思路,谷歌一下,才知要用到BFS,既然要用到BFS,那当然形成一个抽象图。这里我们将每一个字符串当做图中一节点,如果两字符串只需通过变化一个字符即可相等,我们认为这两字符串相连。
- 遍历图中节点时,我们通常会利用一个visit还标识是否访问过,这里我们将处理过的节点直接从dict中删除,以免重复处理。
- 实现代码:
#include <iostream> #include <string> #include <queue> #include <unordered_set> using namespace std; /* Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such that: Only one letter can be changed at a time Each intermediate word must exist in the dictionary For example, Given: start = "hit" end = "cog" dict = ["hot","dot","dog","lot","log"] As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog", return its length 5. Note: Return 0 if there is no such transformation sequence. All words have the same length. All words contain only lowercase alphabetic characters. */ class Solution { public: int ladderLength(string start, string end, unordered_set<string> &dict) { if(start.empty() || end.empty() || dict.empty()) return 0; queue<string> squ[2];//这里需要用到两个队列,因为是bfs,按层遍历,所以需要一层一层进行处理 squ[0].push(start); bool qid = false; int minLen = 1; while(!squ[qid].empty()) { while(!squ[qid].empty())//处理同一层节点 { string curstr = squ[qid].front(); squ[qid].pop(); for(int i = 0; i < curstr.size(); i++) { for(char j = 'a'; j <= 'z'; j++) { if(j == curstr[i]) continue; char t = curstr[i]; curstr[i] = j; if(curstr == end) { return minLen+1; } if(dict.count(curstr) > 0) { squ[!qid].push(curstr); dict.erase(curstr); } curstr[i] = t; } } } qid = !qid;//表示将要处理的下一层 minLen++; } return 0; } }; int main(void) { string start("hit"); string end("cog"); unordered_set<string> dict; dict.insert("hot"); dict.insert("dot"); dict.insert("dog"); dict.insert("lot"); dict.insert("log"); Solution solution; int min = solution.ladderLength(start, end, dict); cout<<min<<endl; return 0; }
-----------------------我和我追猪的梦-----------------------------------------------------------------
作者:mickole