-212のテーマ別バックトラックLeetcode。単語検索II(単語検索II)
すべての単語はまた、二次元のグリッドと辞書に現れる見つけるために、二次元のグリッドボードと辞書の単語で単語のリストを考えます。
単語、隣接するセル内の文字のアルファベット順に構成する必要があり、水平方向または垂直方向に隣接するセルに隣接している「隣接」セル。同じセル内の文字が繰り返される言葉では許可されていません。
例:
入力: 言葉=["oath","pea","eat","rain"]
理事会= [ [ 'O'、 'A'、 'A'、 'N-']、 [ 'E'、 'T'、 'A'、 'E']、 [ 'I'は、 ' H '' K '' R&LT ']、 [' I 'は、' F '' L '' V「] ] 出力:["eat","oath"]
注意:
あなたは、することにより、そのすべて小文字入力をとることができる a-z
組成物。
ヒント:
- あなたは、テストデータ量が多いことでアルゴリズムをバックトラックに最適化する必要があります。あなたは早く戻って停止することはできますか?
- 現在の単語が接頭辞内のすべての単語に存在しない場合は、すぐに戻って停止することができます。データ構造はどのような効果的な操作を行うことができますか?ハッシュテーブルは可能でしょうか?なぜ?どのように接頭辞木?あなたは、基本的なプレフィックスツリーを実装する方法を学習したい場合は、質問を確認してください: トライ(プレフィックスツリー)を達成します。
分析:ブラシとは、それを最適化する際に問題がこの問題を解決することができるプレフィックスツリーを書くように求め、私は+ DFSは、ハードそれを行うにはバックトラック、時間が表示されない、時間の複雑さは、第二、非常に高いです。
される79個の質問のマップのバージョンをアップグレードしたが、特定の参照、VIS配列を制御する必要がある、という問題もある79個の質問を。
クラスのソリューション{ 一覧 <文字列> ANS = 新しい ArrayListを<> (); INT DIRX [] = 新しい INT [] {0,0,1、-1 }。 INT DIRY [] = 新しい INT [] {1、-1,0,0 }。 int型 VIS [] [] = ヌル; パブリックリストの<string> findWords(CHAR [] []ボード、文字列[]語){ VIS = 新しい INT [board.length] [ボード[0 ] .LENGTH]。 一覧 <文字列>リスト= は、Arrays.asList(ワード)。 int型 MAXLEN =getMaxLen(リスト); 以下のために(int型私= 0;私はboard.length <;私は++ ){ のために(int型 J = 0; jの<ボード[0] .LENGTHあり、j ++ ){ 場合(はlist.size()!= 0 ){ VIS [I ] [J] = 1 。 DFS(ボード、リスト、I、J、VIS、ボード[I] [J] + "" 、MAXLEN)。 VIS [i] [j]は = 0 ; } } } 戻りANS。 } 公共 ボイド DFS(CHAR [] []ボード、リストの<string>言葉、int型のx、int型の Y、int型、[] [] VIS、今文字列をint型MAXLENを){ 場合(now.length()> MAXLEN){ 返します。 } もし(現在words.contains()&&!今ans.contains()){ ans.add(今)。 } もし(!{hasPrefix(今、単語)) を返します。 } のために(int型、iは4 <; I = 0 iは++ ){ int型 XX = X + DIRX [I]; INT YY = Y + DIRY [I]。 もし(XX> = 0 && XX <board.length && YY> = 0 && YY <ボード[0] .LENGTH && VIS [XX] [YY] == 0 ){ VIS [XX] [YY] = 1 。 DFS(ボード、単語、XX、YY、VIS、今 + ボード[XX] [YY]、MAXLEN)。 VIS [XX] [YY] = 0 ; } } } 公共 のint getMaxLen(リストの<string> リスト){ int型の最大値= 0 。 もし(はlist.size()== 0)の戻り 0 ; 用{(リスト文字列) 最大 = Math.max(MAX、String.lengthです())。 } 戻り値の最大値。 } パブリック ブール hasPrefix(文字列の接頭辞、リストの<string> リスト){ int型 LEN = prefix.length()。 用(文字列:リスト){ 場合(String.lengthです()> = LEN && string.substring(0 、LEN).equals(接頭辞)){ 戻り 真。 } } を返す 偽。 } }