Given a 2D board and a word, find if the word exists in the grid.
The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.
Example:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
Given word = "ABCCED", return true.
Given word = "SEE", return true.
Given word = "ABCB", return false.
二维矩阵一直不太熟悉解题思路,这个题目正好梳理一下。
1. 先遍历二维矩阵,两层for循环,遍历的时候判断当前元素是不是第一个char
2. 如果不是,继续for循环,如果是,递归调用,方位上下左右四个节点
有个问题没有想太明白,为什么需要把访问过的节点标记呢?然后递归访问完上下左右后再解除标记?后来想了想, 防止重复访问,比如c相等,开始递归遍历上下左右,左边的节点的“上下左右”是不是包括我们刚才的节点,此时直接判断等于false就不会在对这个节点进行dfs访问了。异或256也可以改成其他操作,只有修改后的字符不在矩阵出现的字符范围内就可以。
//标记已经访问,为什么需要标记,这个场景貌似不用,深度优先遍历
board[x][y]^=256;
boolean isExist=dfs(board,words,idx+1,x+1,y)||dfs(board,words,idx+1,x-1,y)||dfs(board,words,idx+1,x,y+1)
||dfs(board,words,idx+1,x,y-1);
//解除标记
board[x][y]^=256;
class Solution {
public boolean exist(char[][] board, String word) {
if(word==null||board.length==0){
return false;
}
char[] wordArray=word.toCharArray();
int i=0;
//遍历二维矩阵
for(int x=0;x=board.length||y>=board[0].length){
return false;
}
if(words[idx]!=board[x][y]){
return false;
}
//标记已经访问,为什么需要标记,这个场景貌似不用,深度优先遍历
board[x][y]^=256;
boolean isExist=dfs(board,words,idx+1,x+1,y)||dfs(board,words,idx+1,x-1,y)||dfs(board,words,idx+1,x,y+1)
||dfs(board,words,idx+1,x,y-1);
//解除标记
board[x][y]^=256;
return isExist;
}
}