LeetCode 127. Word Ladder
要点:
- 转化为unordered_set来做,因为它比map、vector的搜索更快,unordered_set的底层是基于哈希的,所以对于频繁的搜索,插入,删除是很有利的。
- 构图不需要从BFS之前就进行,因为不是每一个点都需要构图,而且每个点只访问一次,所以没必要全图保存,有利于降低时间复杂度。假如是需要频繁访问已访问点,还是全图构造保存比较好。
- 可以看到,在每次访问完结点后,从字典中删掉这个点,既有利于标记已访问,又可以减少后续邻边的搜索次数。
class Solution {
public:
int ladderLength(string beginWord, string endWord, vector<string> &wordList){
if (beginWord == "" || endWord == "" || beginWord == endWord)
return 0;
wordList.erase(unique(wordList.begin(),wordList.end()),wordList.end());
unordered_set<string> s;
for (int i=0;i<wordList.size();i++){
s.insert(wordList[i]);
}
unordered_map<string,int> step;
step[beginWord]=1;
step[endWord]=0;
queue<string> q;
q.push(beginWord);
while (!q.empty())
{
string t=q.front();
q.pop();
if(t==endWord) break;
for (int j = 0; j < t.length(); j++)
{
for (char k = 'a'; k <= 'z'; k++)
{
string temp = t;
temp[j] = k;
if(temp==t||temp==beginWord||!s.count(temp)) continue;
q.push(temp);
step[temp]=step[t]+1;
s.erase(temp);
}
}
}
return step[endWord];
}
};
- 注意一旦push完就代表访问了,就需要标记,好吧,这是BFS基本的要点,我没掌握牢罢辽。
- 这个卡时间真的好严格啊,我超时了N次后面改了unordered才过,无语,算是学习了新的标准库的容器了。