79. Word Search

Given a 2D board and a word, find if the word exists in the grid.

The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.

Example:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

Given word = "ABCCED", return true.
Given word = "SEE", return true.
Given word = "ABCB", return false.

又没申清题意,没有注意adjacent这个关键词。想用一个Boolean数组记录,我就说这题怎么可能这么简单。
然后呢,大佬们纷纷给出解答,比较多的是dfs,我一看,嗬,这不是回溯吗,再查了一下

class Solution {
    public boolean exist(char[][] board, String word) {
        int m = board.length;
        int n = board[0].length;
        boolean[][] visited = new boolean[m][n];
        for(int i = 0; i < m; i++){//Need traverse all possible i and j until get result
            for(int j = 0; j < n; j++){
                if(dfs(board,word,0,i,j,visited)) return true;
            }
        }
        return false;
    }
    public boolean dfs(char[][] board, String word, int index, int x, int y,boolean[][] visited){
        if(index==word.length()) return true;   //Means get what needed
        
        if(x<0||x==board.length||y<0||y==board[0].length) return false; //Means go beyond the boundary
         if(visited[x][y]) return false;    //Single element can only be accessed once in a dfs
        if(board[x][y] != word.charAt(index)) return false;
        visited[x][y]= true;    //Means current element never been accessed and existed in word.
            if(dfs(board, word, index+1, x+1,y,visited)||//right
               dfs(board, word, index+1, x-1,y,visited)||//left
               dfs(board, word, index+1, x,y+1,visited)||//up
               dfs(board, word, index+1, x,y-1,visited)){//down
                return true;
            }
               visited[x][y] = false;   //Release element xy to be accessed by next dfs
               return false;
    }
}

 

 

    private static int m, n;
    private static final int[][] dirs = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
    
    public boolean exist(char[][] board, String word) {
        if (word == null || word.length() == 0)
            return true;
        
        m = board.length; 
        n = board[0].length;
        char firstChar = word.charAt(0);
        
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (board[i][j] == firstChar) {
                    // Mark as visited.
                    board[i][j] = '-';
                    if (searchFrom(i, j, board, word, 1))
                        return true;
                    // Restore to unvisited.
                    board[i][j] = firstChar;
                }
            }
        }
            
        return false;
    }
    
    private static boolean searchFrom(int x, int y, char[][] board, String word, int wi) {        
        // Acception case, leaf.
        if (wi == word.length()) 
            return true;
        
        for (int[] dir : dirs) {
            int nx = x + dir[0];
            int ny = y + dir[1];
            
            if (nx < 0 || nx >= m || ny < 0 || ny >= n || word.charAt(wi) != board[nx][ny])
                continue;
            // Mark as visited.
            board[nx][ny] = '-';
            if (searchFrom(nx, ny, board, word, wi + 1))
                return true;
            // Restore to unvisited.
            board[nx][ny] = word.charAt(wi);
        }
        
        return false;
    }

不能更帅


posted @ 2019-03-06 13:29  Schwifty  阅读(142)  评论(0编辑  收藏  举报