题目:单词搜索
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
[‘A’,‘B’,‘C’,‘E’],
[‘S’,‘F’,‘C’,‘S’],
[‘A’,‘D’,‘E’,‘E’]
]
给定 word = “ABCCED”, 返回 true.
给定 word = “SEE”, 返回 true.
给定 word = “ABCB”, 返回 false.
答案:
思路:需要判断这个矩阵中的每一个结点是否可以走一条路径。每次遍历一个结点的时候,递归的方式分别向左、向右、向上、向下
class Solution {
public boolean exist(char[][] board, String word) {
int row = board.length;
int col = board[0].length;
boolean[][] isViewed = new boolean[row][col];
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
if(pathIsValid(i,j,0,board,word,isViewed))
return true;
}
}
return false;
}
private boolean pathIsValid(int row, int col, int k, char[][] board, String word, boolean[][] isViewed) {
//下标不符合,index对应的值不为和字符数组中的不一致,或者该index已经被访问,这些情况只要有符合的就返回false
if(row >= board.length || row < 0 || col >= board[0].length || col < 0 || k >= word.length() || board[row][col] != word.charAt(k) || isViewed[row][col] == true)
return false;
if(k == word.length() - 1){ // 最后一个字母也相等, 返回成功
return true;
}
isViewed[row][col] = true; // 避免该位重复使用
if(pathIsValid(row+1,col,k+1,board,word,isViewed) || // 往下走
pathIsValid(row-1,col,k+1,board,word,isViewed) || // 往上走
pathIsValid(row,col+1,k+1,board,word,isViewed) || // 往右走
pathIsValid(row,col-1,k+1,board,word,isViewed)) // 往左走
return true; // 其中一条能走通,就算成功
isViewed[row][col] = false; //如果都不通,则回溯上一状态
return false;
}
}