知识点
哈希表 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; } };