Given two words (beginWord and endWord), and a dictionary, 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 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.
每次只能改变一个字符,求最短路径。
开始想法为列出二维矩阵,找出变化一次,变化两次,知道变化为end,从而求最短路径。然而发现需要内存过多,同时超时。
改为采用BFS,这样首先找到的肯定是最短路径。但是同样超时。看到网上都是用java实现的,不知道是什么问题。
1 class Solution { 2 private: 3 int isOneDiff(string beginWord, string endWord) 4 { 5 int n=beginWord.size(); 6 int m=endWord.size(); 7 if(n!=m) return -1; 8 int count=0; 9 for(int i=0;i<n;i++) 10 { 11 if(beginWord[i]!=endWord[i]) 12 count++; 13 14 } 15 if(count>1) return -1; 16 return count; 17 } 18 public: 19 int ladderLength(string beginWord, string endWord, unordered_set<string>& wordDict) { 20 int n=wordDict.size(); 21 if(beginWord.empty()||endWord.empty()||n<1||beginWord.size()!=endWord.size()||isOneDiff(beginWord,endWord)==0) 22 return 0; 23 if(isOneDiff(beginWord,endWord)==1) 24 return 2; 25 if((wordDict.find(beginWord)!=wordDict.end())&&(wordDict.find(endWord)!=wordDict.end())&&(n==2)) 26 return 0; 27 queue<string> q; 28 map<string,int> wordmap; 29 int wordlength=beginWord.size(); 30 int count=1; 31 q.push(beginWord); 32 wordmap.insert(pair<string,int>(beginWord,count)); 33 while(!q.empty()) 34 { 35 string tmpword=q.front(); 36 count=wordmap[tmpword]; 37 q.pop(); 38 for(int i=0;i<wordlength;i++) 39 { 40 41 for(char j='a';j<='z';j++) 42 { 43 if(j==tmpword[i]) continue; 44 tmpword[i]=j; 45 if(tmpword==endWord) return count+1; 46 if(wordDict.find(tmpword)!=wordDict.end()) 47 { 48 q.push(tmpword); 49 wordmap.insert(pair<string,int>(tmpword,count+1)); 50 } 51 } 52 } 53 } 54 55 return 0; 56 } 57 };