123. 单词搜索
给出一个二维的字母板和一个单词,寻找字母板网格中是否存在这个单词。
单词可以由按顺序的相邻单元的字母组成,其中相邻单元指的是水平或者垂直方向相邻。每个单元中的字母最多只能使用一次。
样例
样例 1:
输入:["ABCE","SFCS","ADEE"],"ABCCED"
输出:true
解释:
[
A B C E
S F C S
A D E E
]
(0,0)A->(0,1)B->(0,2)C->(1,2)C->(2,2)E->(2,1)D
样例 2:
输入:["z"],"z"
输出:true
解释:
[ z ]
(0,0)z
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) {
boolean flag;
char[] chars = word.toCharArray();
for (int j = 0; j < board.length; j++) {
for (int k = 0; k < board[j].length; k++) {
if (chars[0] == board[j][k]) {
flag = dfs(board, chars, 1, j, k);
if (flag) return true;
}
}
}
return false;
}
private boolean dfs(char[][] board, char[] chars, int i, int j, int k) {
// System.out.println(board[j][k]+","+j+","+k);
if (chars.length == i) return true;
boolean flag;
char temp = board[j][k];
board[j][k] = '.';
if (j > 0) {
if (board[j - 1][k] == chars[i]) {
flag = dfs(board, chars, i + 1, j - 1, k);
if (flag) return true;
}
}
if (k > 0) {
if (board[j][k - 1] == chars[i]) {
flag = dfs(board, chars, i + 1, j, k - 1);
if (flag) return true;
}
}
if (j < board.length - 1) {
if (board[j + 1][k] == chars[i]) {
flag = dfs(board, chars, i + 1, j + 1, k);
if (flag) return true;
}
}
if (k < board[j].length - 1) {
if (board[j][k + 1] == chars[i]) {
flag = dfs(board, chars, i + 1, j, k + 1);
if (flag) return true;
}
}
board[j][k] = temp;
return false;
}
}