知识点
哈希表 BFS
思路
这是一个从beginWord到endWord的最短路问题,由于每次权重为1,所以可以用bfs解决。
bfs很容易搜索空间爆炸,但是本题要求搜索的每个节点必须出现过,所以状态数最多有2000个。
所以我们可以用哈希表存储所有的允许的字符串,每次用O(1)的时间得到是否存在该元素(实际上如果key是string的话会和字符串长度正比)
每次转移我们枚举把某个字母转换成哪一个小写字母即可,每次最多考虑16*26次
时间复杂度为 n是合法字符串的数目,m是字符串的长度,由于哈希表判断,实际的时间复杂度是
AC Code (C++)
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param beginWord string字符串
* @param endWord string字符串
* @param wordList string字符串vector
* @return int整型
*/
using psi = pair<string, int>;
int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
// bfs最短路
unordered_set<string> S(wordList.begin(), wordList.end());
queue<psi> q;
q.emplace(beginWord, 1);
S.erase(beginWord);
while (!q.empty()) {
auto [s, step] = q.front();
q.pop();
for (int i = 0; i < s.size(); i ++) {
for (char c = 'a'; c <= 'z'; c ++) {
if (s[i] == c) continue;
auto t = s[i];
s[i] = c;
if (S.count(s)) {
if (s == endWord) return step + 1;
S.erase(s);
q.emplace(s, step + 1);
}
s[i] = t;
}
}
}
return 0;
}
};

京公网安备 11010502036488号