LeetCode79 Word Search 字搜索 C++

Given a 2D board and a word, find if the word exists in the grid.

The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.

Example:

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

Given word = "ABCCED", return true.
Given word = "SEE", return true.
Given word = "ABCB", return false.

题源:here;完整实现:here

思路:

这道题时典型的回溯法,即尝试性的遍历各种合法的可能。代码如下:

class Solution {
public:
	bool searchOne(vector<vector<char>> board, int row, int col, string rest){
		if (rest.size() == 0) return true;
		int rowLen = board.size(), colLen = board[0].size();
		vector<vector<int>> newIdx = { { row - 1, col }, { row + 1, col }, { row, col - 1 }, { row, col + 1 } };
		for (auto idx : newIdx){
			if (idx[0] >= 0 && idx[0] < rowLen && idx[1] >= 0 && idx[1] < colLen && board[idx[0]][idx[1]] == rest[0]){
				char tempChar = board[idx[0]][idx[1]]; board[idx[0]][idx[1]] = '.';
				string tempRest = rest; tempRest.erase(0, 1);
				if (searchOne(board, idx[0], idx[1], tempRest)) return true;
				board[idx[0]][idx[1]] = tempChar;
			}
		}

		return false;
	}

	bool exist(vector<vector<char>>& board, string word) {
		for (int i = 0; i < board.size(); i++){
			for (int j = 0; j < board[0].size(); j++){
				if (board[i][j] == word[0]){
					char tempChar = board[i][j]; board[i][j] = '.';
					string tempRest = word; tempRest.erase(0, 1);
					if (searchOne(board, i, j, tempRest)) return true;
					board[i][j] = tempChar;
				}
			}
		}

		return false;
	}
};


猜你喜欢

转载自blog.csdn.net/m0_37518259/article/details/80971504