• 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;
        }
    }
    
  • 相关阅读:
    Java核心技术 卷一 笔记四 库类的直接使用
    Java核心技术 卷一 笔记三 大数值及数组
    Java核心技术 卷一 笔记2 字符串的复制
    Java核心技术 卷一 笔记1
    修改css 样式后, hover事件 不生效
    修改 element ui input 输入框 样式不生效问题
    css3 计算属性
    Vue3 改动系列
    浏览器实现,向下滑动 鼠标滚轮,页面横向移动
    linux ceont0s7 vue 打包压缩图片 一直报错
  • 原文地址:https://www.cnblogs.com/CodeSPA/p/13660429.html
Copyright © 2020-2023  润新知