1. 程式人生 > 實用技巧 >leetcode-79 單詞搜尋

leetcode-79 單詞搜尋

 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陣列,就進坑了。當然也是我自己沒記牢。 在我的這份不怎好的程式碼中需要注意兩點:

  1. 在進行判斷的時候,不僅要判斷
    board[i][j]!=words[k]||visited[i][j] 還要判斷這個visited[i][j]的狀態
  2. 在進行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的判斷,所以我個人認為改程式碼是比較清晰了。