classSolution{Set<Integer> set =newHashSet<>();int m, n;publicbooleanexist(char[][] board,String word){
m = board.length;
n = board[0].length;for(int i =0; i < m; i++){for(int j =0; j < n; j++){if(board[i][j]== word.charAt(0)){//符合条件进入dfs搜索if(dfs(board, word, i * n + j,0)){returntrue;}}}}returnfalse;}publicbooleandfs(char[][] board,String word,int index,int l){int i = index / n;int j = index % n;//添加当前下标,根据java中set集合的特性,若set集合中已经存在该元素,则无法继续添加,并且返回false,否则返回trueif(!set.add(index)){returnfalse;}//判断当前是否匹配到了最后一个字符if(l == word.length()-1){returntrue;}//标准dfsif(i >0&& board[i -1][j]== word.charAt(l +1)){if(dfs(board, word,(i -1)* n + j, l +1)){returntrue;}}if(i < m -1&& board[i +1][j]== word.charAt(l +1)){if(dfs(board, word,(i +1)* n + j, l +1)){returntrue;}}if(j >0&& board[i][j -1]== word.charAt(l +1)){if(dfs(board, word, i * n + j -1, l +1)){returntrue;}}if(j < n -1&& board[i][j +1]== word.charAt(l +1)){if(dfs(board, word, i * n + j +1, l +1)){returntrue;}}//删除当前下标,即当前路径往后退一步,称为回溯
set.remove(index);returnfalse;}}