Word Ladder 未完成

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 };
原文地址:https://www.cnblogs.com/zl1991/p/4712174.html