leetcode 单词搜索 dfs

79. 单词搜索

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

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

给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.

一道经典的深搜题,在此记录下。

 

public class 单词搜索 {
    int[] dx = {-1, 0, 1, 0};
    int[] dy = {0, 1, 0, -1};
    public boolean exist(char[][] board, String word) {
        if (word.length() == 0 || board.length == 0) {
            return false;
        }
        int m = board.length;
        int n = board[0].length;

        boolean[][] vis = new boolean[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (board[i][j] == word.charAt(0)) {
                    vis[i][j] = true;
                    if (dfs(board, i, j, 1, vis, word)) {
                        return true;
                    }
                    vis[i][j] = false;
                }
            }
        }
        return false;
    }

    private boolean dfs(char[][] board, int x, int y, int cur, boolean[][] vis, String word) {

        if (cur == word.length()) {
            return true;
        }
        for (int i = 0; i < 4; i++) {
            int nx = dx[i] + x;
            int ny = dy[i] + y;
            if (nx >= 0 && nx < board.length && ny >= 0 && ny < board[0].length && !vis[nx][ny]) {
                if (board[nx][ny] == word.charAt(cur)) {
                    vis[nx][ny] = true;
                    if (dfs(board, nx, ny, cur + 1, vis, word)) {
                        return true;
                    }
                    vis[nx][ny] = false;
                }
            }
        }
        return false;

    }

    public static void main(String[] args) {
        char[][] board =
                {
                        {'A', 'B', 'C', 'E'},
                        {'S', 'F', 'C', 'S'},
                        {'A', 'D', 'E', 'E'}
                };
        单词搜索 obj = new 单词搜索();
        System.out.println(obj.exist(board, "ABCCED"));
        System.out.println(obj.exist(board, "SEE"));
        System.out.println(obj.exist(board, "ABCB"));
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章