单词搜索

题目描述

来源于 https://leetcode-cn.com/

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

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

示例:

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

给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.

解法:

本题是深度优先搜索的问题,从矩阵中某个位置开始向四面八方进行搜索。由于是在图中搜索,对于处理过的位置,使用特殊符号标记,表示已经访问过。

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
		int n_rows = board.size();
		int n_cols = board[0].size();

		for(int row=0;row<n_rows;row++){
			for(int col=0;col<n_cols;col++){
				if(dfs(board, word, 0, row, col)){
					return true;
				}
			}
		}
		return false;
    }

private:
	bool dfs(vector<vector<char>>& board, const string& word, int i, int row, int col){
		if(i == word.size()){
			return true;
		}

		int n_rows = board.size();
		int n_cols = board[0].size();

		if(row == n_rows || row < 0 || col == n_cols || col < 0){
			return false;
		}
		char ch = board[row][col];

		if(ch != word[i]){
			return false;
		}

		board[row][col] = '*';
		
		bool exist = dfs(board, word, i+1, row-1, col) ||
			dfs(board, word, i+1, row+1, col) ||
			dfs(board, word, i+1, row, col-1) ||
			dfs(board, word, i+1, row, col+1);

		board[row][col] = ch;

		return exist;
	}
};