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 transformed word must exist in the word list. Note that beginWord is not a transformed word.
Note:
- Return 0 if there is no such transformation sequence.
- All words have the same length.
- All words contain only lowercase alphabetic characters.
- You may assume no duplicates in the word list.
- You may assume beginWord and endWord are non-empty and are not the same.
Example 1:
Input: beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"] Output: 5 Explanation: As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog", return its length 5.
Example 2:
Input: beginWord = "hit" endWord = "cog" wordList = ["hot","dot","dog","lot","log"] Output: 0 Explanation: The endWord "cog" is not in wordList, therefore no possible transformation.
----------------------------------------------------------------------------------------------------------------------
我发现我现在实力很弱,得更加努力了。
这个题是说的就是把一个字符串改变其中一个字符,并且保证改变后的字符串再给定的一个字典上有,然后,如果最后改得到的字符串时符合要求的字符串,统计改变的次数,否则返回0. 和图的遍历类似,只是每次要遍历26个字符,用BFS最合适。
参考链接:http://www.cnblogs.com/grandyang/p/4539768.html(强烈推荐这个大佬)
C++代码:
class Solution { public: int ladderLength(string beginWord, string endWord, vector<string>& wordList) { unordered_set<string> wordset(wordList.begin(),wordList.end()); //建立一个字典。 if(!wordset.count(endWord)) return 0; //如果endWord不在字典上,那无论改多少次,都不能得到这个字符串。 queue<string> q; q.push(beginWord); int res = 0; while(!q.empty()){ for(int k = q.size(); k > 0; k--){ string word = q.front(); q.pop(); if(word == endWord) return res + 1; for(int i = 0; i < word.size(); i++){ string newword = word; for(char ch = 'a'; ch <= 'z';ch++){ newword[i] = ch; if(wordset.count(newword) && newword!=word){ q.push(newword); wordset.erase(newword); //由于转变后得到的字符串不能与前面的相同,所以得在字典上删除相应的字符串。 } } } } ++res; } return 0; } };