题目描述 给定一个 m x n
二维字符网格 board
和一个字符串单词 word
。如果 word
存在于网格中,返回 true
;否则,返回 false
。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例 1:
1 2 输入:board = [["A" ,"B" ,"C" ,"E" ],["S" ,"F" ,"C" ,"S" ],["A" ,"D" ,"E" ,"E" ]], word = "ABCCED" 输出:true
示例 2:
1 2 输入:board = [["A" ,"B" ,"C" ,"E" ],["S" ,"F" ,"C" ,"S" ],["A" ,"D" ,"E" ,"E" ]], word = "SEE" 输出:true
示例 3:
1 2 输入:board = [["A" ,"B" ,"C" ,"E" ],["S" ,"F" ,"C" ,"S" ],["A" ,"D" ,"E" ,"E" ]], word = "ABCB" 输出:false
提示:
m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board
和 word
仅由大小写英文字母组成
进阶: 你可以使用搜索剪枝的技术来优化解决方案,使其在 board
更大的情况下可以更快解决问题?
解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 class Solution { public boolean exist (char [][] board, String word) { int row = board.length; int col = board[0 ].length; boolean [][] visited = new boolean [row][col]; for (int i = 0 ; i < row; i++) { for (int j = 0 ; j < col; j++) { boolean flag = check(board, word, visited, i, j, 0 ); if (flag == true ) { return true ; } } } return false ; } public boolean check (char [][] board, String word, boolean [][] visited, int i, int j, int k) { if (board[i][j] != word.charAt(k)) { return false ; } else if (k == word.length() - 1 ) { return true ; } boolean result = false ; visited[i][j] = true ; int [][] directions = {{0 , 1 }, {0 , -1 }, {-1 , 0 }, {1 , 0 }}; for (int [] dir : directions) { int x = i + dir[0 ]; int y = j + dir[1 ]; if (x >= 0 && x < board.length && y >= 0 && y < board[0 ].length) { if (!visited[x][y]) { boolean flag = check(board, word, visited, x, y, k + 1 ); if (flag) { result = true ; break ; } } } } visited[i][j] = false ; return result; } }
$$ O(MN \cdot 3^L) $$
来源:力扣(LeetCode) 链接:79. 单词搜索 - 力扣(LeetCode)
链接:剑指 Offer 12. 矩阵中的路径 - 力扣(LeetCode)