トピック:
与えられた二つの単語(beginWord と endWord)、および辞書の単語リストは、最短から変換シーケンスの長さを見つける beginWord に endWord、その結果を:
- 一つだけの文字を一度に変更することができます。
- 各変換された単語は単語リストに存在している必要があります。ことに注意してください beginWordがあり ません 変換単語。
注意:
- そのような変換シーケンスが存在しない場合は0を返します。
- すべての単語は、同じ長さを有しています。
- すべての単語は小文字のみアルファベット文字が含まれています。
- あなたは、単語リストには重複を想定していません。
- あなたは、想定し得る beginWord と endWordが 非空であり、同じではありません。
例1:
入力: beginWord = "ヒット"、 endWord = "コグ"、 wordListに= [ "ホット"、 "ドット"、 "犬"、 "たくさん"、 "ログ"、 "コグ"] 出力:5 説明:1つの最短の変換として、 > "ホット" - - > "ドット" - > "犬" - "ヒット"である> "コグ"は、 その長さ5を返します。
例2:
入力: beginWord = "ヒット" endWord = "コグ" wordListに= [ "ホット"、 "ドット"、 "犬"、 "たくさん"、 "ログ"] 出力:0 説明:endWord "COG"はwordListにではないが、従ってない可能変換。
分析:
二つの単語の開始と終了を考慮すると、単語のリスト、単語の開始と終了を接続するための単語リストを使用するように私たちを必要とし、ルールが文字を変更するための時間の接続を必要とすることであり、そこリストで、終了リスト中の単語も必要です。
私たちは、リスト内の変更単語は、それが記録されている場合順番に各文字は、Zから変更されます、単語の最初から、幅優先探索を使用することができますし、コレクション内の単語は、目的はにあります例えば、重複検索を防ぐために、犬-DOP-dogが、これは時間の無駄であり、新しい単語が追加され、最後の言葉は、設定された単語検索を保存(キュー)が空である場合、証明し、ステップに戻っ数、同じであるとき検索が終了したため、0を返すことができ、見つけることができませんでした。
あなたはアイデアが開始ワード及び終了ワードから検索を開始している間も、幅優先探索が最適化された2ウェイを使用することができますが、また、文字を変更することで、単語の側面のうち、検索時に単語リストにして、2件の集中型検索に追加されます焦点の反対側にある単語を検索し、手段を理解することが表示されます。検索の順序については、単語の一組が他方よりも小さい数ならば、組の数が少ないから検索を開始するための優先順位です。
手順:
C ++
クラスのソリューション{ パブリック: int型 ladderLength(文字列 beginWord、文字列 endWord、ベクトル< 文字列 >&wordListに){ // セット<文字列>辞書。 unordered_set < 文字列 > 辞書。 以下のための(文字列:wordListにS) dict.insert(S); もし(dict.count(endWord)== 0 ) の戻り 0 ; キュー < 文字列 > Q; q.push(beginWord)。 int型リットル=beginWord.length(); INTステップ= 0 。 しばらく(!q.empty()){ ステップ ++ ; INT LEN = q.size()。 以下のために(INT iが= 0 ; I <LEN; ++ I){ 文字列ワード= q.front()。 q.pop(); 用(INT J = 0 ; J <L; ++ J){ チャー CH = ワード[J]。 以下のための(int型のk = "A " ; K <= ' Z '。++ K){ もし(K == CH) 続けます。 ワード[J] = K。 もし(ワード== endWord) 戻り工程+ 1 。 もし(dict.count(ワード)== 0 ) 続けます。 q.push(単語)。 dict.erase(単語)。 } 単語[J] =CH; } } } 戻り 0 。 } }。
// 双方向BFS // ランタイム:28ミリ秒、WordのラダーのためのC ++オンライン提出の高速化よりも98.16パーセント。 クラスのソリューション{ パブリック: int型 ladderLength(文字列 beginWord、文字列 endWord、ベクトル< 文字列 >&wordListに){ // セット<文字列>辞書。 unordered_set < 文字列 > 辞書。 以下のための(文字列:wordListにS) dict.insert(S); もし(dict.count(endWord)== 0 ) を返す 0 ; unordered_set< 文字列 > Q1。 unordered_set < 文字列 > Q2。 q1.insert(beginWord)。 q2.insert(endWord)。 INT L = beginWord.length()。 INTステップ= 0 。 しばらく(q1.empty()&&!q2.empty()){ ステップ ++ ; もし(q1.size()> q2.size()) スワップ(Q1、Q2)。 unordered_set < 文字列 > Q; 用(文字列{:Q1ワード) ため(INT J = 0 ; J <L; ++ J){ チャー CH = ワード[J]。 用(int型 K = ' ' ; K <= ' Z ' ; ++ K){ もし(K == CH) 続けます。 ワード[J] = K。 もし(q2.count(ワード)) 、戻り工程+ 1; もし(dict.count(ワード)== 0 ) 続けます。 q.insert(単語)。 dict.erase(単語)。 } ワード[J] = CH。 } } スワップ(Q、Q1)。 } 戻り 0 。 } }。
ジャワ
クラスのソリューション{ 公共 のint ladderLength(文字列beginWord、文字列endWord、リスト<文字列> wordListに){ 設定 <文字列>のdict = 新しい HashSetの<> (wordListに); もし(!dict.contains(endWord)) の戻り 0 ; キューの<string> Q = 新しい ArrayDeque <> (); q.offer(beginWord)。 INT L = beginWord.length()。 INTステップ= 0 。 しばらく(!q.isEmpty()){ ステップ ++ ; INT LEN = q.size()。 以下のために(INT I 0 =; I <LEN; ++ I){ // 文字列の単語= q.poll()。 StringBuilderの言葉= 新しいStringBuilderの(q.poll()); 用(INT J = 0; J <L; ++ J){ チャー CH = word.charAt(J)。 用(INT K = ''; K < 'Z'; ++ K){ 場合(CH == k)を 続けます。 word.setCharAt(J、(チャー)K); Wストリング = word.toString()。 もし(w.equals(endWord)) 、戻り工程+ 1 。 もし(!dict.contains()ワット) 続けます。 q.offer(W)。 dict.remove(W)。 } word.setCharAt(J、CH)。 } } } 戻り 0 。 } }