LeetCode79-单词搜索

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

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

示例:

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

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

一、思路

(一)深度优先搜索

根据题目要求,上下相邻或者左右相邻的字母都能使用,也是说有多条“路”可供选择,且,在这些“路”中,只要有一条“路”可以走通,就表示能够匹配,显然这是一个深度优先搜索问题

C++代码:

class Solution {
public:

	bool exist(vector<vector<char>>& board, string word) {
		if (word.empty())
			return true;
		if (board.empty() || board[0].empty())
			return false;
		bool ans;
		vector<vector<bool>> use(board.size(), vector<bool>(board[0].size(), true));
		// 找到dfs的起点
		for (int i = 0; i < board.size(); i++)
			for (int j = 0; j < board[0].size(); j++)
				if (board[i][j] == word[0]) {
					use[i][j] = false;
					ans = dfs(board, word, i, j, 1, use);
					if (ans)
						return ans;
					use[i][j] = true;
				}
		return ans;
	}
	bool dfs(vector<vector<char>>& board, string word, int pos_i, int pos_j, int pos, vector<vector<bool>>& use) {
		if (pos == word.size())
			return true;
		bool ans = false;
		if (!ans && pos_i + 1 < board.size() && board[pos_i + 1][pos_j] == word[pos] && use[pos_i + 1][pos_j]) {
			use[pos_i + 1][pos_j] = false;
			ans = dfs(board, word, pos_i + 1, pos_j, pos + 1, use);
			use[pos_i + 1][pos_j] = true;
		}

		if (!ans && pos_i - 1 >= 0 && board[pos_i - 1][pos_j] == word[pos] && use[pos_i - 1][pos_j]) {
			use[pos_i - 1][pos_j] = false;
			ans = dfs(board, word, pos_i - 1, pos_j, pos + 1, use);
			use[pos_i - 1][pos_j] = true;
		}

		if (!ans && pos_j + 1 < board[0].size() && board[pos_i][pos_j + 1] == word[pos] && use[pos_i][pos_j + 1]) {
			use[pos_i][pos_j + 1] = false;
			ans = dfs(board, word, pos_i, pos_j + 1, pos + 1, use);
			use[pos_i][pos_j + 1] = true;
		}

		if (!ans && pos_j - 1 < board[0].size() && board[pos_i][pos_j - 1] == word[pos] && use[pos_i][pos_j - 1]) {
			use[pos_i][pos_j - 1] = false;
			ans = dfs(board, word, pos_i, pos_j - 1, pos + 1, use);
			use[pos_i][pos_j - 1] = true;
		}

		return ans;
	}
};

执行效率:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lyd1995/article/details/89174801