字母迷宫游戏初始界面记作 m x n
二维字符串数组 grid
,请判断玩家是否能在 grid
中找到目标单词 target
。
注意:寻找单词时 必须 按照字母顺序,通过水平或垂直方向相邻的单元格内的字母构成,同时,同一个单元格内的字母 不允许被重复使用 。
示例 1:
输入:grid = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], target = "ABCCED"
输出:true
示例 2:
输入:grid = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], target = "SEE"
输出:true
示例 3:
输入:grid = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], target = "ABCB"
输出:false
提示:
m == grid.length
n = grid[i].length
1 <= m, n <= 6
1 <= target.length <= 15
grid
和target
仅由大小写英文字母组成
思路:
1、二维数组的任何位置都可以作为起始点,因此求出有多少行、多少列,双层循环实现每个元素都可以作为起始点。
2、深度优先遍历+回溯剪枝
递归结束条件 行越界、列越界、二维数组当前元素不等于目标字符串对应字符,直接返回false,字符串字符已经到末尾则返回true。 递归工作 1、已经走过的字符我们让其等于字符‘0’来进行标记。
2、DFS递归当前元素的四个方向,返回值(bool类型)记为tmp,四个方向的关系为或,即一个方向走得通就可以。
3、回溯剪枝,不管当前元素行不行得通,将其恢复原样。
返回值 返回tmp,即返回上一层递归。 3、二维数组所有元素开始都行不通则返回false。
代码实现:
class Solution {
public:
int row;
int col;
bool dfs(vector<vector<char>>& grid, string target, int i, int j, int k) {
if(i < 0 || j < 0 || i >= row || j >= col || grid[i][j] != target[k]) /递归结束条件
return false;
if(k == target.size() - 1)
return true;
grid[i][j] = '0'; //标记已经走过的元素
bool tmp = dfs(grid, target, i + 1, j, k + 1) || dfs(grid, target, i, j + 1, k + 1) || dfs(grid, target, i - 1, j, k + 1) || dfs(grid, target, i, j - 1, k + 1); //DFS四个方向
grid[i][j] = target[k];
return tmp;
}
bool wordPuzzle(vector<vector<char>>& grid, string target) {
row = grid.size();
col = grid[0].size();
for (int i = 0; i < row; ++i) //所有元素都可作为起始点
for (int j = 0; j < col; ++j)
if (dfs(grid, target, i, j, 0))
return true;
return false;
}
};