# 剑指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;
    }
}
posted @ 2020-08-18 10:22  CodeSPA  阅读(89)  评论(0编辑  收藏  举报