[LC] 127ワードラダー

与えられた二つの単語(beginWord  と  endWord)、および辞書の単語リストは、最短から変換シーケンスの長さを見つける  beginWord  に  endWord、その結果を:

  1. 一つだけの文字を一度に変更することができます。
  2. 各変換された単語は単語リストに存在している必要があります。ことに注意してください  beginWordが  あり  ません  変換単語。

注意:

  • そのような変換シーケンスが存在しない場合は0を返します。
  • すべての単語は、同じ長さを有しています。
  • すべての単語は小文字のみアルファベット文字が含まれています。
  • あなたは、単語リストには重複を想定していません。
  • あなたは、想定し得る  beginWord  と  endWordが  非空であり、同じではありません。

例1:

入力:
beginWord = "ヒット"、
endWordは= "コグ"、
wordListには= [ "ホット"、 "ドット"、 "犬"、 "たくさん"、 "ログイン"、 "コグ"] 

出力:5 

説明:1つの最短の変換として、 > "ホット" - - > "ドット" - "ヒット"はある> "犬" - > "コグ"、
その長さ5を返します。

例2:

入力:
beginWordは= "ヒット" 
endWord = "コグ" 
wordListに= [ "ホット"、 "ドット"、 "犬"、 "たくさん"、 "ログイン"] 

出力:0 

説明:endWord "COG"はwordListにではないが、従ってない可能変換。

解決方法1:
時間:O(N ^ 2)TLEにつながる
スペース:O(N)
1  クラスのソリューション:
 2      DEF ladderLength(自己、beginWord:STR、endWord:STR、wordListに:リスト[STR]) - > INT:
 3          であれば beginWord == endWord 又は endWord ない wordListに:
 4              戻り0
 5          = 1、ステップ
 6          ladder_dict = self.build_dict(beginWord、wordListに)
 7          からのコレクションはインポート両端キュー
 8          キュー= 両端キュー([beginWord])
 9は、          =訪問{beginWord}
 10          ながらキュー:
11              サイズ= LEN(キュー)
 12              のための I における範囲(サイズ):
 13                  cur_word = queue.popleft()
 14                  なら cur_word == endWord:
 15                      戻りステップ 
 16                  word_lst = ladder_dict.get(cur_word)
 17                  のための言葉word_lst:
 18                      もし単語ない 訪問:
 19                          queue.append(ワード)
 20                          visited.add(ワード)
 21              ステップ+ = 1
22          リターン0
 23      
24      デフbuild_dict(自己、beginWord、wordListに):
 25          my_dict = {}
 26           w_i wordListに:
 27              my_dict [w_i] = []
 28               w_j wordListに:
 29                  であれば self.diff(w_i、w_j) == 1 30                      my_dict [w_i] .append(w_j)
 31          なら beginWord ない my_dict:
 32              my_dict [beginWord] = []
 33               w_jwordListに:
 34                  であれば self.diff(beginWord、w_j)== 1 35                      my_dict [beginWord] .append(w_j)
 36          リターンmy_dict
 37      
38      デフ差分(自己、S、T):
 39          カウント= 0
 40          のための範囲(LEN(S)):
 41              であれば、S [I] =!T [I]:
 42                  カウント+ = 1つの
 43          戻りカウント
 44                     

 

解決策2:

時間:O(N * 26 ^ | Wordlen |)

スペース:O(N)

1  クラス溶液(オブジェクト):
 2      DEF ladderLength(自己、beginWord、endWord、wordListに):
 3          ""」
4          :タイプbeginWord:STR
 5          :タイプendWord:STR
 6          :タイプワードリスト:リスト[STR]
 7          :RTYPE:INT
 8          ""」
9          なら endWord ない wordListに:
 10              リターン0
 11          インポート12          からコレクションインポート両端キュー
 13          アルファ= string.ascii_lowercase
 14         キュー= 両端キュー([beginWord])
 15          訪問= {beginWord}
 16          WORD_LIST = セット(wordListに)
 17          ステップ= 1
 18  
19          ながらキュー:
 20              サイズ= LEN(キュー)
 21              のための I における範囲(サイズ):
 22                  cur_word = キュー.popleft()
 23                  なら cur_word == endWord:
 24                      戻りステップ 
 25                  
26                  のための I における範囲(LEN(cur_word)):
 27                      チャー中のアルファ:
 28                          new_word = cur_word [:I] +チャー+ cur_word [I + 1 :]
 29                          もし new_word  WORD_LIST  new_word ない 訪問:
 30                              queue.append(new_word)
 31                              visited.add(new_word)
 32              ステップ+ = 1つの
 33          リターン0
 34         

 

おすすめ

転載: www.cnblogs.com/xuanlu/p/11711305.html