classSolution{ publicbooleanexist(char[][] board, String word){ for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[0].length; j++) { if (board[i][j] == word.charAt(0) && dfs(board, word, i, j, 0)) returntrue; } } returnfalse; }
privatebooleandfs(char[][] board, String word, int i, int j, int start){ //边界条件,如果索引越界或者当前位置不满足条件,则返回false if (i >= board.length || i < 0 || j >= board[0].length || j < 0 || board[i][j] != word.charAt(start)) returnfalse;
//已经找到满足条件的字符串 if (start == word.length() - 1) returntrue;
//这里可以减少创建标记数组的开销,直接在搜索之前先将当前位置置为符号,递归后再恢复 char temp = board[i][j]; board[i][j] = '$'; boolean result = dfs(board, word, i - 1, j, start + 1) || dfs(board, word, i + 1, j, start + 1) || dfs(board, word, i, j - 1, start + 1) || dfs(board, word, i, j + 1, start + 1); board[i][j] = temp; return result; } }