题解 | #牛群最短移动序列#
牛群最短移动序列
https://www.nowcoder.com/practice/6473462e05ac4665baec04caf628abdd
考察的知识点:哈希、广度优先搜索;
解答方法分析:
- 创建一个无序集合dict,将单词列表wordList中的所有单词添加到其中,以便快速查找。
- 创建一个队列q,并将开始单词beginWord放入队列中。
- 创建一个无序集合visited,并将开始单词beginWord添加到其中表示已访问过。
- 创建一个变量step,用于记录转换步骤。
- 通过while循环,判断队列是否为空,如果不为空,则执行以下步骤:a. 获取当前队列中的单词数量size。b. 遍历size次,对当前队列中的单词进行处理:从队列中弹出一个单词curWord。如果curWord等于结束单词endWord,则返回步骤数step。对curWord的每个字符进行变换,将其替换为a到z的每个字符:保存替换前的原始字符originalChar。将curWord的第j个字符替换为字符c。如果dict中存在替换后的单词curWord,并且该单词未被访问过(即未在visited中),则将curWord添加到队列q中,并将其添加到visited中表示已访问过。恢复curWord的第j个字符为原始字符originalChar。c. 增加步骤数step。
所用编程语言:C++;
完整编程代码:↓
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param beginWord string字符串
* @param endWord string字符串
* @param wordList string字符串vector
* @return int整型
*/
int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
unordered_set<string> dict(wordList.begin(), wordList.end());
queue<string> q;
q.push(beginWord);
unordered_set<string> visited;
visited.insert(beginWord);
int step = 1;
while (!q.empty()) {
int size = q.size();
for (int i = 0; i < size; i++) {
string curWord = q.front();
q.pop();
if (curWord == endWord) {
return step;
}
for (int j = 0; j < curWord.length(); j++) {
char originalChar = curWord[j];
for (char c = 'a'; c <= 'z'; c++) {
curWord[j] = c;
if (dict.find(curWord) != dict.end() &&
visited.find(curWord) == visited.end()) {
q.push(curWord);
visited.insert(curWord);
}
}
curWord[j] = originalChar;
}
}
step++;
}
return 0;
}
};
查看2道真题和解析
