LeetCode$79. 单词搜索

    技术2025-10-24  16

    给定一个二维网格和一个单词,找出该单词是否存在于网格中。

    单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

    示例:

    board = [ [‘A’,‘B’,‘C’,‘E’], [‘S’,‘F’,‘C’,‘S’], [‘A’,‘D’,‘E’,‘E’] ]

    给定 word = “ABCCED”, 返回 true 给定 word = “SEE”, 返回 true 给定 word = “ABCB”, 返回 false

    提示:

    board 和 word 中只包含大写和小写英文字母。 1 <= board.length <= 200 1 <= board[i].length <= 200 1 <= word.length <= 10^3

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/word-search 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    回溯法,尽量提前截止dfs,且限制进入dfs的条件

    class Solution { public: //直接DFS就可以了吧 bool exist(vector<vector<char>>& board, string word) { if(word.size() == 0)return true; vector<vector<bool>> visited(board.size(),vector<bool>(board[0].size(),false)); for(int i=0;i<board.size();i++){ for(int j=0;j<board[0].size();j++){ if(board[i][j] == word[0]){ //可以从当前位置开始dfs if(dfs(board,visited,word,0,i,j)) return true; } } } return false; } bool dfs(vector<vector<char>>& board,vector<vector<bool>>& visited,string& word,int index,int i,int j){ if(index == word.size()-1) return board[i][j] == word[index]; visited[i][j] = true; //cout<<i<<" "<<j<<endl; //相邻方向 bool up,down,left,right; up = down = left = right = false; if(i >= 1 && !visited[i-1][j] && board[i-1][j] == word[index+1]) up = dfs(board,visited,word,index+1,i-1,j); if(up) return true; if(j >= 1 && !visited[i][j-1] && board[i][j-1] == word[index+1]) left = dfs(board,visited,word,index+1,i,j-1); if(left) return left; if(i < board.size()-1 && !visited[i+1][j] && board[i+1][j] == word[index+1]) down = dfs(board,visited,word,index+1,i+1,j); if(down)return down; if(j < board[0].size()-1 && !visited[i][j+1] && board[i][j+1] == word[index+1]) right = dfs(board,visited,word,index+1,i,j+1); if(right)return true; visited[i][j] = false; //cout<<up<<" "<<down<<" "<<left<<" "<<right<<endl;; return false; } };
    Processed: 0.009, SQL: 9