単語検索--DFS

0x01の。問題

単語がグリッドに存在するかどうかを調べるために、二次元のグリッドと言葉を与えられました。
単語、隣接するセル内の文字のアルファベット順に構成する必要があり、隣接する水平方向または垂直方向に隣接するセルである「隣接」セル。同じセル内の文字を再利用することを許可されていません。
入力例:
ボード=
[
[ 'A'、 'B'、 'C'、 'E']、
[ 'S'、 'F.'、 'C'、 'S']、
[ 'A'、 'D' 、 'E'、 'E']
]
指定した単語= "ABCCED"、trueを返します
与えられた単語= "SEE"、trueを返します
与えられた単語= "ABCB"、falseを返す
ヒント:boardそしてword含まのみ大文字と小文字英語を手紙。1 <= board.length <= 200 1 <= board[i].length <= 200 1 <= word.length <= 10^3

0×02。分析

疑い、DFSが良いだろう検索の使用、せずに、2次元マトリックス内の単語を検索します。

しかし、我々はまだいくつかの注意事項があります。

  • 各条件が返されていることに注意してください。
  • 対象の制御下の単語に注意してください。
  • 注タグは、要素へのアクセスを持っています。
  • この問題は、再帰を検討する方が便利になります。

最適化:

  • 使用する引数が渡されました。
  • 使用temp覚書配列を離れて最適化された変数を。

0×03。分解能コード-DFS(再帰的)

class Solution {
public:
    int dir[4][4]={{-1,0},{1,0},{0,-1},{0,1}};
    bool dfs(vector<vector<char>>& board,string& word,int i,int j,int w){
        if(board[i][j]!=word[w]) return false;
        if(w==word.size()-1) return true;
        char temp=board[i][j];
        board[i][j]='0';
        for(int k=0;k<4;k++){
            int new_x=i+dir[k][0];
            int new_y=j+dir[k][1];
            if(new_x>=0&&new_x<board.size()&&new_y>=0&&new_y<board[0].size()){
                if(dfs(board,word,new_x,new_y,w+1)) return true;
            }
        }
        board[i][j]=temp;
        return false;
    }
    bool exist(vector<vector<char>>& board, string word) {
        for(int i=0;i<board.size();i++){
            for(int j=0;j<board[i].size();j++){
                if(board[i][j]==word[0]){
                    if(dfs(board,word,i,j,0)) return true;
                }
            }
        }
        return false;
    }
};

ATFWUS --Writingにより、2020年3月21日

公開された128元の記事 ウォンの賞賛144 ・は 10000 +を見て

おすすめ

転載: blog.csdn.net/ATFWUS/article/details/105008568