剑指 Offer 12. 矩阵中的路径
word
中的不匹配也直接返回falseword
的最后一个字符,即curIndex == cs.length-1
(curIndex为每次搜索的深度,不过是从0开始的,就是在word
中的位置;cs.length-1
为最后一个字符的索引位置),因此后面剩下的就不用查找了class Solution { public boolean exist(char[][] board, String word) { char[] cs = word.toCharArray(); // 遍历整个二维数组,即将每个字符作为第一个字符进行尝试 for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[0].length; j++) { // 只要有一条符合条件,则返回true if (dfs(board, cs, i, j, 0)) { return true; } } } // 没找到 return false; } public boolean dfs(char[][] board, char[] cs, int i, int j, int curIndex) { // 超过二维数组边界就返回false // 字符不匹配也直接结束递归 if (i < 0 || i >= board.length || j < 0 || j >= board[0].length || board[i][j] != cs[curIndex]) { return false; } // 如果以及全部匹配到了,就直接返回true,而不用继续匹配剩下的啦 if (curIndex == cs.length - 1) { return true; } // 能递归到这里,说明当前cs中curIndex索引对应的字符和boards是匹配的 // 因此我们需要吧遍历过的字符设置为空白,防止再次遍历 board[i][j] = '\0'; boolean res = dfs(board, cs, i + 1, j, curIndex + 1) || dfs(board, cs, i - 1, j, curIndex + 1) || dfs(board, cs, i, j + 1, curIndex + 1) || dfs(board, cs, i, j - 1, curIndex + 1); // 回溯的时候要把原来设置为空白字符的还原 board[i][j] = cs[curIndex]; // 只要出现true,就一路返回 return res; } }
word
的长度K
,因此复杂度为\(3^K\)word
的长度