leetcode-79 單詞搜尋
阿新 • • 發佈:2020-11-27
public boolean exist(char[][] board,String word) { char[] words=word.toCharArray(); boolean[][] visited=new boolean[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,words,i,j,0,visited)) {return true; } } } return false; } private boolean dfs(char[][] board, char[] words, int i, int j, int k,boolean[][] visited) { if(i>=board.length||i<0||j>=board[0].length||j<0||board[i][j]!=words[k]||visited[i][j]) {return false; } if(k==words.length-1) return true; boolean res=false; if(!visited[i][j]) { visited[i][j]=true; res=dfs(board,words,i+1,j,k+1,visited)||dfs(board,words,i,j-1,k+1,visited)||dfs(board,words,i,j+1,k+1,visited)||dfs(board,words,i-1,j,k+1,visited); visited[i][j]=false; } return res; }
這上面是有visited陣列的,按道理來講回溯法的通用模板就是要帶一個visited的陣列,這個陣列的作用就是在進行dfs的時候,我們要向前、向後、向上、向下訪問,但是如果沒有沒有一個變數去限制是否已經訪問過這個狀態,那麼很容易出現再次訪問已經訪問過的字元;之前我就是因為沒有加visited陣列,就進坑了。當然也是我自己沒記牢。 在我的這份不怎好的程式碼中需要注意兩點:
- 在進行判斷的時候,不僅要判斷
board[i][j]!=words[k]||visited[i][j] 還要判斷這個visited[i][j]的狀態
- 在進行dfs之前也要進行 if(!visited[i][j])的判斷
但是後來看到一份程式碼,寫的極其舒適,這裡我將它複製在這裡:
class Solution { public boolean exist(char[][] board,String word) { char[] words=word.toCharArray(); for(int i=0;i<board.length;i++) { for(int j=0;j<board[0].length;j++) { if(dfs(board,words,i,j,0)) { return true; } } } return false; } private boolean dfs(char[][] board, char[] words, int i, int j, int k) { if(i>=board.length||i<0||j>=board[0].length||j<0||board[i][j]!=words[k]) { return false; } if(k==words.length-1) return true; char tmp=board[i][j]; board[i][j]='.'; boolean res=dfs(board,words,i+1,j,k+1)||dfs(board,words,i,j-1,k+1)||dfs(board,words,i,j+1,k+1) ||dfs(board,words,i-1,j,k+1); board[i][j]=tmp; return res; } }
這裡利用一個
board[i][j]!=words[k] 以及把訪問的char設定為“。” ,一下子就把我的visited陣列給省去了,而且還防止我漏寫visited的判斷,所以我個人認為改程式碼是比較清晰了。