题目
题目链接
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。
[[“a”,“b”,“c”,“e”],
[“s”,“f”,“c”,“s”],
[“a”,“d”,“e”,“e”]]
但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。
示例 1:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
示例 2:
输入:board = [["a","b"],["c","d"]], word = "abcd"
输出:false
提示:
1 <= board.length <= 200
1 <= board[i].length <= 200
解题思路
回溯,就找路径呗 dfs,走一个点就上下左右找下一个满足条件的点,找不到状态重置,找到了继续下一个点。
代码
class Solution {
public boolean exist(char[][] board, String word) {
//记录当前点是否走过
boolean[][] isvisited = new boolean[board.length][board[0].length];
//判空操作
if (board.length == 0) {
return false;
}
//如果word为空 那一定存在这样的空路径满足
if (word == null || word.length() == 0) {
return true;
}
//遍历二维数组中的每一个点 以该点出发是否能找到一条完整的路径
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
//若找到一定就是true了
if (isexist(board, isvisited, i, j, word.toCharArray(), 0)) {
return true;
}
}
}
return false;
}
/**
*
* @param board
* @param isvisited 该点是否走过
* @param i 当前点的横坐标
* @param j 当前点的纵坐标
* @param word 字符数组
* @param wordindex 当前字符对应字符数组中的下表
* @return
*/
public boolean isexist(char[][] board, boolean[][] isvisited, int i, int j, char[] word, int wordindex) {
//如果经过一系列操作后 当前字符对应字符数组的下表超过字符数组的大小 证明到当前的点为止可以确定一条完整的路径
if (word.length <= wordindex) {
return true;
}
//如果超出边界,或者当前点走过,或者当前的点对应的值不正确 都到当前的点为止无法确定一条完整的路径
if (i >= board.length || j >= board[0].length || i < 0 || j < 0 || isvisited[i][j] == true||board[i][j]!=word[wordindex]) {
return false;
}
//默认当前点走过
isvisited[i][j] = true;
//判断当前点的上下左右是否符合条件 递归操作
boolean answer = isexist(board, isvisited, i, j - 1, word, wordindex + 1)//左
|| isexist(board, isvisited, i, j + 1, word, wordindex + 1)//右
|| isexist(board, isvisited, i - 1, j, word, wordindex + 1)//上
|| isexist(board, isvisited, i + 1, j, word, wordindex + 1);//下
//若符合则到当前的点为止可以确定一条完整的路径
if (answer) {
return true;
}else{
//否则不能 状态重置
isvisited[i][j] = false;
}
return false;
}
}