LeetCode 79单词搜索
LeetCode 79单词搜索
问题描述:
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
执行用时:13 ms, 在所有 Java 提交中击败了17.88%的用户
内存消耗:41.6 MB, 在所有 Java 提交中击败了80.96%的用户
回溯
class Solution {
public boolean exist(char[][] board, String word) {
//边界条件
if(board==null || board.length==0 || board[0].length==0 || board.length*board[0].length<word.length()) {
return false;
}
boolean[][] isVisited = new boolean[board.length][board[0].length];
//方向数组
int[][] directs = new int[][]{
{0,1},{1,0},{0,-1},{-1,0}
};
for(int row=0; row<board.length; row++) {
for(int col=0; col<board[0].length; col++) {
if(dfs(board, word, 0, new int[]{row, col}, isVisited, directs)) {
return true;
}
}
}
return false;
}
public boolean dfs(char[][] board, String word, int currChar, int[] axis, boolean[][] isVisited, int[][] directs) {
//递归终止: 坐标越界、已访问、不是目标字符、成功匹配完整单词
if((axis[0]>=board.length || axis[0]<0)
|| (axis[1]>=board[0].length || axis[1]<0)
|| isVisited[axis[0]][axis[1]]) {
return false;
}
else if(currChar<word.length() && board[axis[0]][axis[1]]!=word.charAt(currChar)) {
return false;
}
else if(currChar==word.length()-1 && board[axis[0]][axis[1]]==word.charAt(currChar)){
return true;
}
boolean ans = false;
/*标记当前*/
isVisited[axis[0]][axis[1]] = true;
/*深度遍历*/
for(int[] direct:directs) {
ans = ans|dfs(board, word, currChar+1, new int[]{axis[0]+direct[0], axis[1]+direct[1]}, isVisited, directs)
if(ans) {
break;
}
}
/*取消标记*/
isVisited[axis[0]][axis[1]] = false;
return ans;
}
}