给出一个二维的字母板和一个单词,寻找字母板网格中是否存在这个单词。
单词可以由按顺序的相邻单元的字母组成,其中相邻单元指的是水平或者垂直方向相邻。每个单元中的字母最多只能使用一次。
样例
给出board =
[
"ABCE",
"SFCS",
"ADEE"
]
word = "ABCCED", ->返回 true,
word = "SEE",-> 返回 true,
word = "ABCB", -> 返回 false.
解题思路:
二维DFS
public class Solution {
/**
* @param board: A list of lists of character
* @param word: A string
* @return: A boolean
*/
public boolean exist(char[][] board, String word) {
// write your code here
if(board == null || board.length == 0 || board[0].length == 0)
return false;
if(word.length() == 0)
return true;
int row = board.length, col = board[0].length;
boolean[][] isVisited = new boolean[row][col];
for(int i = 0; i < row; i++)
for(int j = 0; j < col; j++)
if(dfs(board, word, isVisited, i, j, 0))
return true;
return false;
}
private int[][] p = {{1,0},{-1,0},{0,1},{0,-1}};
//以board[x][y]为起点向四个方向深搜
private boolean dfs(char[][] board, String word, boolean[][] isVisited, int x, int y, int index){
//递归出口
if(index == word.length())
return true;
//越界返回false
if(x < 0 || x >= board.length || y < 0 || y >= board[0].length)
return false;
//访问过或者对应字母不相等返回false
if(isVisited[x][y] || board[x][y] != word.charAt(index))
return false;
isVisited[x][y] = true;
//朝四个方向尝试
for(int i=0; i<4; i++)
if(dfs(board, word, isVisited, x + p[i][0], y + p[i][1], index + 1))
return true;
//回溯
isVisited[x][y] = false;
return false;
}
}