# 剑指Offer 12 矩阵中的路径
剑指Offer 12 矩阵中的路径
给定一个字符矩阵和一个字符串,判断矩阵中是否存在一条路径能够匹配该字符串
执行用时:7 ms, 在所有 Java 提交中击败了44.58%的用户
内存消耗:41.8 MB, 在所有 Java 提交中击败了45.65%的用户
DFS+回溯
class Solution {
public boolean exist(char[][] board, String word) {
/*字符矩阵中找一条满足给定词汇的路径
* 算法:深度优先搜索DFS+剪枝
* 实现:递归(需要额外写递归函数)
* */
/*输入合法性*/
int rows = board.length, cols = board[0].length;
if(word.length()>rows*cols) return false;
char[] w = word.toCharArray();
for(int i=0;i<rows;i++)
for(int j=0;j<cols;j++) {
if(dfs(board,i,j,w,0)) return true;
}
return false;
}
/*搜索函数(递归调用)dfs
* param1: 搜索矩阵 matrix
* param2: 起点位置 (i,j)
* param3: 搜索字符 word[k] k为搜索深度
* */
public boolean dfs(char[][] matrix, int i, int j, char[] word, int k) {
/*边界合法性*/
/*搜索超过矩阵边界 or 字符不匹配*/
if(i<0 || i>=matrix.length || j<0 || j>=matrix[0].length || matrix[i][j]!=word[k])
return false;
/*到达底部,搜索结束*/
if(k==word.length-1) return true;
/*深度搜索*/
/*搜索顺序:下、上、右、左*/
/*防止重复搜索(即搜索到上一次的字符), 搜索完后需要恢复(指针传递)*/
char temp = matrix[i][j];
matrix[i][j] = '/';
boolean res = dfs(matrix,i+1,j,word,k+1) || dfs(matrix,i-1,j,word,k+1)
|| dfs(matrix,i,j-1,word,k+1) || dfs(matrix,i,j+1,word,k+1);
matrix[i][j] = temp;
return res;
}
}