-79のテーマ別バックトラックLeetcode。単語検索(検索ワード)

-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 ; 
            } 
        } 
        
        
    } 
}

 

おすすめ

転載: www.cnblogs.com/qinyuguan/p/11330171.html