-79のテーマ別バックトラックLeetcode。単語検索(検索ワード)
単語がグリッドに存在するかどうかを調べるために、二次元のグリッドと言葉を与えられました。
単語、隣接するセル内の文字のアルファベット順に構成する必要があり、水平方向または垂直方向に隣接するセルに隣接している「隣接」セル。同じセル内の文字を再利用することを許可されていません。
例:
ボード= [ [ 'A'、 'B'、 'C'、 'E']、 [ 'S'、 'F.'、 'C'、 'S']、 [ 'A'、 'D'、E」 '' E「] ] = "ABCCED"与えられた言葉は、。trueを返す 、= "SEE"という言葉与えられた真を返します。 = "ABCB"という言葉与えられ、falseを返します。
分析:
マップを考えると、(右、上、下、左)期間の後にパスを見つけるには、指定した単語を形成することができます。
問題問題の古典的なマップ+バックタイプは、質問はマップは、経験してきたかどうかを制御するためにVIS配列を必要と
後戻りていることを確認しないように。
前に旅したときにVIS [X] [Y] = 1は、行っていません。
VIS [X] [Y] = 0が前に行っていない示し、行くことができます。
ACコード:
クラスソリューション{ ブールフラグ= 偽。 INT DIRX [] = 新しい INT [] {1、-1,0,0 }。 INT DIRY [] = 新しい INT [] {0,0,1、-1 }。 パブリック ブール存在(CHAR [] []ボード、文字列の単語が){ 場合(board.length == 0 || word.equals( "" )){ 戻り 偽。 } チャー最初= word.charAt(0 )。 以下のために(int型 i = 0; iはboard.length <; iは++ ){ 用(int型 J = 0; J <ボード[0] .LENGTH; J ++ ){ 場合(ボード[I] [J] == 最初の){ int型 VIS [] [] = 新しい INT [board.length] [ボード[0 ] .LENGTH]。 VIS [I] [j]が 1を= 。 DFS(ボード、VIS、I、J、単語、 1 ); VIS [i] [j]は = 0 ; } } } 戻りフラグ。 } 公共 ボイド DFS(CHAR [] []ボード、INT VIS [] []、int型のx、int型の Y、文字列の単語、int型今){ 場合(今== word.length()){ フラグ = 真。 返します。 } であれば(フラグ)のリターン; INT、M = board.length。 int型、N =ボード[0 ] .LENGTH。 以下のために(int型、iは4 <; I = 0 iは++ ){ int型 XX = X + DIRX [I]; INT YY = Y + DIRY [I]。 もし(XX> = 0 && XX <M && YY> = 0 && YY <N && VIS [XX] [YY] == 0 &&ボード[XX] [YY] ==word.charAt(現在)){ VIS [XX] [YY] = 1 。 DFS(ボード、VIS、今XX、YY、単語、 1 ); VIS [XX] [YY] = 0 ; } } } }