class Solution {
public boolean exist(char[][] board, String word) {
if (board == null || word == null)
return false;
int[][] visited = new int[board.length][board[0].length];
for (int i = 0; i < board.length; i++)
for (int j = 0; j < board[0].length; j++)
visited[i][j] = 0;
int pathLength = 0;
for (int i = 0; i < board.length; i++)
for (int j = 0; j < board[0].length; j++)
if (exitCore(board, word, i, j, visited, pathLength))
return true;
return false;
}
private boolean exitCore(char[][] board, String word, int i, int j, int[][] visited, int pathLength) {
if (pathLength == word.length())
return true;
boolean exist = false;
if (i >= 0 && i < board.length && j >= 0 && j < board[0].length && board[i][j] == word.charAt(pathLength) && visited[i][j] == 0) {
++pathLength;
visited[i][j] = 1;
exist = exitCore(board, word, i + 1, j, visited, pathLength) || exitCore(board, word, i - 1, j, visited, pathLength) || exitCore(board, word, i, j - 1, visited, pathLength) || exitCore(board, word, i, j + 1, visited, pathLength);
if (!exist) {
--pathLength;
visited[i][j] = 0;
}
}
return exist;
}
}