classSolution{boolean[][] visited;boolean found;publicbooleanexist(char[][] board,String word){char[] wordArr = word.toCharArray();int m = board.length;int n = board[0].length;
visited =newboolean[m][n];// 找到入口,就进行查找for(int i =0; i < m; i++){for(int j =0; j < n; j++){if(wordArr[0]== board[i][j]){
visited[i][j]=true;
found =find(board, wordArr, i, j,1);if(found){return found;}
visited[i][j]=false;}}}returnfalse;}booleanfind(char[][] board,char[] word,int x,int y,int index){if(index == word.length){returntrue;}// 找四个方向if(x +1< board.length &&!visited[x +1][y]&& word[index]== board[x +1][y]){
visited[x +1][y]=true;
found =find(board, word, x +1, y, index +1);if(found){return found;}
visited[x +1][y]=false;}if(x -1>=0&&!visited[x -1][y]&& word[index]== board[x -1][y]){
visited[x -1][y]=true;
found =find(board, word, x -1, y, index +1);if(found){return found;}
visited[x -1][y]=false;}if(y +1< board[0].length &&!visited[x][y +1]&& word[index]== board[x][y +1]){
visited[x][y +1]=true;
found =find(board, word, x, y +1, index +1);if(found){return found;}
visited[x][y +1]=false;}if(y -1>=0&&!visited[x][y -1]&& word[index]== board[x][y -1]){
visited[x][y -1]=true;
found =find(board, word, x, y -1, index +1);if(found){return found;}
visited[x][y -1]=false;}return found;}}
更新版 2.0
卧槽。。之前这么长的代码我怎么受得了T T
classSolution{boolean[][] visited;publicbooleanexist(char[][] board,String word){char[] arr = word.toCharArray();
visited =newboolean[board.length][board[0].length];for(int i =0; i < board.length; i++){for(int j =0; j < board[0].length; j++){if(dfs(board, arr,0, i, j)){returntrue;}}}returnfalse;}// 符合当前字符,则进入下一层publicbooleandfs(char[][] board,char[] arr,int index,int i,int j){if(index == arr.length){returntrue;}// 越界、不符、已访问if(i == board.length || j == board[0].length || i ==-1|| j ==-1||
arr[index]!= board[i][j]|| visited[i][j]){returnfalse;}
visited[i][j]=true;// 短路运算符||:剪枝boolean res =dfs(board, arr, index +1, i +1, j)||dfs(board, arr, index +1, i -1, j)||dfs(board, arr, index +1, i, j +1)||dfs(board, arr, index +1, i, j -1);
visited[i][j]=false;return res;}}
无注释纯净版
classSolution{boolean[][] visited;publicbooleanexist(char[][] board,String word){char[] arr = word.toCharArray();
visited =newboolean[board.length][board[0].length];for(int i =0; i < board.length; i++){for(int j =0; j < board[0].length; j++){if(dfs(board, arr,0, i, j)){returntrue;}}}returnfalse;}publicbooleandfs(char[][] board,char[] arr,int index,int i,int j){if(index == arr.length){returntrue;}if(i == board.length || j == board[0].length || i ==-1|| j ==-1||
arr[index]!= board[i][j]|| visited[i][j]){returnfalse;}
visited[i][j]=true;boolean res =dfs(board, arr, index +1, i +1, j)||dfs(board, arr, index +1, i -1, j)||dfs(board, arr, index +1, i, j +1)||dfs(board, arr, index +1, i, j -1);
visited[i][j]=false;return res;}}