文章目录
题目
思路
本题可以用搜索与回溯算法,本质上是递归,当遍历到当前元素时,递归遍历当前元素的上、左、下、右方元素
构造递归
1.边界条件
- 行列超出索引,返回false;
- 当前元素与字符串单词不符,返回false;
- 当前元素已经匹配到字符串单词最后一位,返回true;
2.递归处理
当当前元素与字符串单词相符,但是并没有匹配到最后一位时
- 将当前元素置为’ ',避免重复访问
- 递归访问当前元素的上、左、下、右方元素
- 将当前元素恢复
- 返回第2步的调用结果(四个调用只要有一个true就返回true)
可能从矩阵中任意位置开始递归,所以用两个循环来开始递归。
故递归应包含一下参数:
- board 被比较的矩阵
- words 被比较的字符串
- i,j 当前行、列索引
- k 当前比较到字符串的第几个字符
代码
class Solution {
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[]words, int i, int j ,int k){
if(i<0 || i>=board.length) return false;
else if(j<0 || j>=board[0].length) return false;
else if(board[i][j] != words[k]) return false;
else if(k==words.length-1) return true;
else{
board[i][j]=' ';
boolean res = dfs(board,words,i+1,j,k+1) || dfs(board,words,i-1,j,k+1) || dfs(board,words,i,j-1,k+1) || dfs(board,words,i,j+1,k+1);
board[i][j] = words[k];
return res;
}
}
}