Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest transformation sequence from beginWord to endWord, such that:
- Only one letter can be changed at a time
- Each intermediate word must exist in the word list
For example,
Given:
beginWord = "hit"
endWord = "cog"
wordList = ["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.
思路:
Step1:把本题看成是树状结构
Step2:通过两个队列,实现层次搜索
class Solution { public: int ladderLength(string beginWord, string endWord, unordered_set<string>& wordList) { queue<string> queue_to_push; queue<string> queue_to_pop; bool endFlag = false; string curStr; int level = 1; char tmp; queue_to_pop.push(beginWord); wordList.erase(beginWord); //if beginWord is in the dict, it should be erased to ensure shortest path while(!queue_to_pop.empty()){ curStr = queue_to_pop.front(); queue_to_pop.pop(); //find one letter transformation for(int i = 0; i < curStr.length(); i++){ //traverse each letter in the word for(int j = 'a'; j <= 'z'; j++){ //traverse letters to replace if(curStr[i]==j) continue; //ignore itself tmp = curStr[i]; curStr[i]=j; if(curStr == endWord){ return level+1; } else if(wordList.count(curStr)>0){ //occur in the dict queue_to_push.push(curStr); wordList.erase(curStr); } curStr[i] = tmp; //back track } } if(queue_to_pop.empty()){//move to next level swap(queue_to_pop, queue_to_push); level++; } } return 0; } };