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才过,无语,算是学习了新的标准库的容器了。