与えられた二つの単語(beginWord と endWord)、および辞書の単語リストは、最短から変換シーケンスの長さを見つける beginWord に endWord、その結果を:
- 一つだけの文字を一度に変更することができます。
- 各変換された単語は単語リストに存在している必要があります。ことに注意してください 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_jでwordListに: 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