79. 单词搜索

2021-08-18  本文已影响0人  justonemoretry
image.png

解法

class Solution {
    public boolean exist(char[][] board, String word) {
        int row = board.length;
        int col = board[0].length;
        boolean[][] visited = new boolean[board.length][board[0].length];
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                // 以数组中的每个元素为起点,进行遍历
                if (dfs(board, visited, i, j, 0, word)) {
                    return true;
                }
            }
        }
        return false;
    }
  
    private boolean dfs(char[][] board, boolean[][] visited, int i, int j, int k, String word) {
        int row = board.length;
        int col = board[0].length;
        if (i < 0 || i > row - 1) {
            return false;
        }
        if (j < 0 || j > col - 1) {
            return false;
        }
        // 已经访问过 或者 当前访问的不等于word对应位置的元素
        if (visited[i][j] || board[i][j] != word.charAt(k)) {
            return false;
        }
        visited[i][j] = true;
        k++;
        if (k == word.length()) {
            return true;
        }
       // 深度优先遍历
        int[][] forwards = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        for (int[] forward : forwards) {
            if (dfs(board, visited, i + forward[0], j + forward[1], k, word)) {
                return true;
            }
        }
        // 走到这,说明这个节点的分支都走了,并且没有成功的
        // 这种情况下进行回溯
        visited[i][j] = false;
        return false;
    }
}
上一篇下一篇

猜你喜欢

热点阅读