Given two words (beginWord and endWord), and a dictionary, find the length of shortest transformation sequence from beginWord to endWord, such that:

  1. Only one letter can be changed at a time
  2. 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 };