LeetCode79. 单词搜索

 

☆☆☆☆思路:二维平面上的回溯法。

  先将问题转化为树形问题,每一个点都有四个方向可以走,若规定顺时针即为“上->右->下->左”。

  注意:关于标记某个格子是否被访问过有两个思路,一是设置visited[][]布尔数组,二是直接修改输入数据,回溯时再改回来。

     在具体面试中,需要询问面试官是否可以修改输入数据!

 

代码1(设置vis[][]数组,耗时:6ms):

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++) {
            for (int j = 0; j < n; j++) {
                // 从 坐标(i,j) 开始查找
                if (dfs(board, i, j, visited,0, word)) {
                    return true;
                }
            }
        }
        return false;
    }
    // 从board[x][y]开始,寻找word[index...word.size())
    private boolean dfs(char[][] board, int x, int y, boolean[][] visited, int index, String word) {
        // 越界判断 以及 是否访问过 判断
        if (x < 0 || x >= board.length || y < 0 || y >= board[0].length || visited[x][y]) return false;
        if (board[x][y] != word.charAt(index)) return false;
        if (index == word.length() - 1) {
            return true;
        }
        visited[x][y] = true;
        // 顺时针方向搜索
        boolean res = dfs(board, x - 1, y, visited,index + 1, word)
                        || dfs(board, x, y + 1, visited,index + 1, word)
                        || dfs(board, x + 1, y, visited,index + 1, word)
                        || dfs(board, x, y - 1, visited,index + 1, word);
        visited[x][y] = false;
        return res;
    }
}

 

代码2(修改输入数据,耗时:6ms)

class Solution {
    public boolean exist(char[][] board, String word) {
        int m = board.length, n = board[0].length;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (dfs(board, i, j, 0, word)) {
                    return true;
                }
            }
        }
        return false;
    }
    private boolean dfs(char[][] board, int x, int y, int index, String word) {
        // 记得大边界要带等号!!老是忘 T.T
        if (x < 0 || x >= board.length || y < 0 || y >= board[0].length) return false;
        if (board[x][y] != word.charAt(index)) return false;
        if (index == word.length() - 1) {
            return true;
        }
        char temp = board[x][y];
        board[x][y] = '#';
        boolean res = dfs(board, x - 1, y, index + 1, word)
                        || dfs(board, x, y + 1, index + 1, word)
                        || dfs(board, x + 1, y, index + 1, word)
                        || dfs(board, x, y - 1, index + 1, word);
        board[x][y] = temp;
        return res;
    }
}

 

posted @ 2020-12-29 11:13  不学无墅_NKer  阅读(91)  评论(0编辑  收藏  举报