面试题12:矩阵中的路径
一、题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。
二、问题分析
此问题与面试题13 剑指Offer:机器人的运动范围 近乎相同,算法思想上是一致的。
但是我想强调一点,在13题中所求的是机器人的运动范围类似于计数,自然而然对于统计个数,在回溯过程中,visited是不需要还原的,不然会造成重复。
而此题所求是矩阵中的路径,是需要visited还原的,就像你走过的路人家也可以走。
三、问题解决
public boolean exist(char[][] board, String word) {
char[] words = word.toCharArray();
for(int i = 0; i < board.length; i++) {
for(int j = 0; j < board[0].length; j++) {
if(dfs(board, words, i, j, 0)) return true;
}
}
return false;
}
boolean dfs(char[][] board, char[] word, int i, int j, int k) {
if(i >= board.length || i < 0 || j >= board[0].length || j < 0 || board[i][j] != word[k]) return false;
if(k == word.length - 1) return true;
//走过的结点不能再走,'\0'在下个递归时不会与work[k]相对,直接返回
board[i][j] = '\0';
boolean res = dfs(board, word, i + 1, j, k + 1) || dfs(board, word, i - 1, j, k + 1) ||
dfs(board, word, i, j + 1, k + 1) || dfs(board, word, i , j - 1, k + 1);
//复原board的值,因为能走到这一句,一定满足board[i][j] = work[k],本质上应该是temp= board[i][j],之后board[i][j]还原元素
board[i][j] = word[k];
return res;
}