给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.
解题思路:
遍历二维数组,先找到单词的第一个字符,然后依次为起点,深度搜索该单词,当搜索失败时回。
由于同一个单元格内的字母不可重复使用,因此需一个boolean[][]数组记录某一个单元格内的字母是否被使用过。
java代码:
class Solution {
public boolean exist(char[][] board, String word) {
if(0 == board.length || 0 == board[0].length)
return false;
if("".equals(word))
return true;
int m = board.length, n = board[0].length;
boolean[][] f = new boolean[m][n];
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(board[i][j] == word.charAt(0)) {
f[i][j] = true;
if(dfs(i, j, board, f, word, 1))
return true;
f[i][j] = false;
}
}
}
return false;
}
private boolean dfs(int line, int col, char[][] board, boolean[][] f, String word, int s) {
if(s == word.length())
return true;
if(line > 0 && !f[line-1][col] && board[line-1][col] == word.charAt(s)) {
f[line-1][col] = true;
if(dfs(line-1, col, board, f, word, s+1))
return true;
f[line-1][col] = false;
}
if(line < board.length-1 && !f[line+1][col] && board[line+1][col] == word.charAt(s)) {
f[line+1][col] = true;
if(dfs(line+1, col, board, f, word, s+1))
return true;
f[line+1][col] = false;
}
if(col > 0 && !f[line][col-1] && board[line][col-1] == word.charAt(s)) {
f[line][col-1] = true;
if(dfs(line, col-1, board, f, word, s+1))
return true;
f[line][col-1] = false;
}
if(col < board[0].length-1 && !f[line][col+1] && board[line][col+1] == word.charAt(s)) {
f[line][col+1] = true;
if(dfs(line, col+1, board, f, word, s+1))
return true;
f[line][col+1] = false;
}
return false;
}
}