LeetCode 79单词搜索

LeetCode 79单词搜索

问题描述:
  给定一个二维网格和一个单词,找出该单词是否存在于网格中。
  单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

执行用时:13 ms, 在所有 Java 提交中击败了17.88%的用户
内存消耗:41.6 MB, 在所有 Java 提交中击败了80.96%的用户

回溯

class Solution {
    public boolean exist(char[][] board, String word) {
        //边界条件
        if(board==null || board.length==0 || board[0].length==0 || board.length*board[0].length<word.length()) {
            return false;
        }

        boolean[][] isVisited = new boolean[board.length][board[0].length];
        //方向数组
        int[][] directs = new int[][]{
                {0,1},{1,0},{0,-1},{-1,0}
        };
        for(int row=0; row<board.length; row++) {
            for(int col=0; col<board[0].length; col++) {
                if(dfs(board, word, 0, new int[]{row, col}, isVisited, directs)) {
                    return true;
                }
            }
        }
        return false;
    }

    public boolean dfs(char[][] board, String word, int currChar, int[] axis, boolean[][] isVisited, int[][] directs) {
        //递归终止: 坐标越界、已访问、不是目标字符、成功匹配完整单词
        if((axis[0]>=board.length || axis[0]<0)
            || (axis[1]>=board[0].length || axis[1]<0)
            || isVisited[axis[0]][axis[1]]) {
            return false;
        }
        else if(currChar<word.length() && board[axis[0]][axis[1]]!=word.charAt(currChar)) {
            return false;
        }
        else if(currChar==word.length()-1 && board[axis[0]][axis[1]]==word.charAt(currChar)){
            return true;
        }
        
        boolean ans = false;
        /*标记当前*/
        isVisited[axis[0]][axis[1]] = true;
        /*深度遍历*/
        for(int[] direct:directs) {
            ans = ans|dfs(board, word, currChar+1, new int[]{axis[0]+direct[0], axis[1]+direct[1]}, isVisited, directs)
            if(ans) {
                break;
            }
        }
        /*取消标记*/        
        isVisited[axis[0]][axis[1]] = false;
        return ans;
    }
}
posted @ 2020-09-13 10:05  CodeSPA  阅读(98)  评论(0编辑  收藏  举报