zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    
  • 相关阅读:
    第十周进度条
    冲刺阶段第十天
    冲刺阶段第九天
    冲刺阶段第八天
    冲刺阶段第七天
    冲刺阶段第六天
    第一次冲刺阶段(十一)
    第一次冲刺阶段(十)
    第一次冲刺阶段(九)
    第一次冲刺阶段(八)
  • 原文地址:https://www.cnblogs.com/CodeSPA/p/13660429.html
Copyright © 2011-2022 走看看