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; } }