考察知识点:哈希、层序遍历
题目分析:
首先要自己举几个例子,发现其中的规律。
发现beginWord在选择要更改的字符的时候,不一定是先改第一个字符,或者是将第一个字符改成endWord第一个字符,这样都是没有观察例子,盲目猜测的结果。
通过观察例子,我们发现,与beginWord只有一个字符之差的所有字符串都应该访问一遍,子树同理。那么我们就可以将问题转化为层序遍历,找最短的路径即可。
所用编程语言:C++
#include <iterator>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param beginWord string字符串
* @param endWord string字符串
* @param wordList string字符串vector
* @return int整型
*/
int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
// write code here
unordered_set<string> st(wordList.begin(), wordList.end());
if (!st.count(endWord)) return 0;
int steps = 0;
queue<string> q;
q.push(beginWord);
unordered_set<string> visited;
visited.insert(beginWord);
while (!q.empty()) {
steps++;
int size = q.size();
for (int i = 0; i < size; i++) {
string curr = q.front();
q.pop();
for (int j = 0; j < curr.length(); j++) {
char orig = curr[j];
for (char ch = 'a'; ch <= 'z'; ch++) {
if (ch == orig) continue;
curr[j] = ch;
if (st.count(curr)) {
if (curr == endWord) return steps + 1;
if (!visited.count(curr)) {
q.push(curr);
visited.insert(curr);
}
}
}
curr[j] = orig;
}
}
}
return 0;
}
};

京公网安备 11010502036488号