字母迷宫游戏初始界面记作 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
仅由大小写英文字母组成
设函数 wordPuzzle(i,j,k)表示判断以网格的 (i,j) 位置出发,能否搜索到单词 word[k..],其中 word[k..] 表示字符串 word 从第 k 个字符开始的后缀子串。如果能搜索到,则返回 true,反之返回 false。函数 wordPuzzle(i,j,k) 的执行步骤如下:
这样,我们对每一个位置 (i,j) 都调用函数 wordPuzzle(i,j,0) 进行检查:只要有一处返回 true,就说明网格中能够找到相应的单词,否则说明不能找到。
为了防止重复遍历相同的位置,需要额外维护一个与 grid 等大的 visited 数组,用于标识每个位置是否被访问过。每次遍历相邻位置时,需要跳过已经被访问的位置。
- public boolean wordPuzzle(char[][] grid, String target) {
- char[] words = target.toCharArray();
- for(int i = 0; i < grid.length; i++) {
- for(int j = 0; j < grid[0].length; j++) {
- if(dfs(grid, words, i, j, 0)) return true;
- }
- }
- return false;
- }
- boolean dfs(char[][] grid, char[] target, int i, int j, int k) {
- if(i >= grid.length || i < 0 || j >= grid[0].length || j < 0 || grid[i][j] != target[k]) return false;
- if(k == target.length - 1) return true;
- grid[i][j] = '\0';
- boolean res = dfs(grid, target, i + 1, j, k + 1) || dfs(grid, target, i - 1, j, k + 1) ||
- dfs(grid, target, i, j + 1, k + 1) || dfs(grid, target, i , j - 1, k + 1);
- grid[i][j] = target[k];
- return res;
- }