当前位置: 首页 > news >正文

回溯-单词搜索

79.单词搜索

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

输入:二维字符数组,给定字符串
输出:布尔值
思路:遍历字符数组,下上右左递归回溯

递归参数: 当前元素在矩阵 board 中的行列索引 i 和 j ,当前目标字符在 word 中的索引 k 。
终止条件
返回 false : (1) 行或列索引越界 或 (2) 当前矩阵元素与目标字符不同 或 (3) 当前矩阵元素已访问过 ( (3) 可合并至 (2) ) 。
返回 true : k = len(word) - 1 ,即字符串 word 已全部匹配。
递推工作
标记当前矩阵元素: 将 board[i][j] 修改为 空字符‘\0’ ,代表此元素已访问过,防止之后搜索时重复访问。
搜索下一单元格: 朝当前元素的 上、下、左、右 四个方向开启下层递归,使用 或 连接 (代表只需找到一条可行路径就直接返回,不再做后续 DFS ),并记录结果至 res 。
还原当前矩阵元素: 将 board[i][j] 元素还原至初始值,即 word[k]

class Solution {
    public boolean exist(char[][] board, String word) {
        char[] words = word.toCharArray();
        //字符数组长度
        int x = board.length;
        int y = board[0].length;
        //遍历字符数组
        for(int i = 0; i < x; i++){
            for(int j = 0; j < y; j++){
                if(backTrack(board, words, i, j, 0)){
                    return true;
                }
            }
        }
        return false;
    }
    public boolean backTrack(char[][] board, char[] words, int x, int y, int index){
        //递归结束
        //数组越界, 或者元素不符  
        if(x < 0 || y < 0 ||
         x >= board.length ||
         y >= board[0].length ||
           board[x][y] != words[index]){
            return false;
        }
        //遍历到words最后一个元素
        if(index == words.length - 1){
            return true;
        }
        //将现在的字符置为空,防止重复访问
        board[x][y] = '\0';
        //递归下上右左
        boolean res = backTrack(board, words, x + 1, y, index + 1) ||
                      backTrack(board, words, x - 1, y, index + 1) || 
                      backTrack(board, words, x, y + 1, index + 1) || 
                      backTrack(board, words, x, y - 1, index + 1);
        //还原
        board[x][y] = words[index];
        return res;
    }
    
}

相关文章:

  • 刘强东突然发声:不该用算法压榨最底层兄弟!东哥,真正的人民企业家
  • 今日行情明日机会——20250321
  • CHM(ConcurrentHashMap)中的 sizeCtl 的作用与值变化详解
  • QT 图表(拆线图,栏状图,饼状图 ,动态图表)
  • 算法系列——有监督学习——5.支持向量机(核方法)
  • Eplan许可分析
  • flutter 专题 九十 四 Flutter开发之基础知识
  • 区间震荡指标
  • JavaWeb之WebSocket
  • Servlet、Servlet的5个接口方法、生命周期、以及模拟实现 HttpServlet 来写接口的基本原理
  • 加速还是安全?CDN与群联云防护的本质差异与适用场景
  • 闻所闻尽:穿透声音的寂静,照见生命的本真
  • 数据库主观题题库及答案
  • 力扣45.跳跃游戏
  • 【leetcode hot 100 39】组合总和
  • 查看GPU型号、大小;CPU型号、个数、核数、内存
  • Vue3 基础语法指南:响应式系统与 Ref 应用
  • JavaIO流的使用和修饰器模式(直击心灵版)
  • 1201. 【高精度练习】蜜蜂路线
  • vpc网络的原理
  • 国家网信办举办在欧中资企业座谈会,就数据跨境流动等进行交流
  • 最高法强化涉新就业形态民事案件审判指导:推动出台司法解释
  • 吕国范任河南省人民政府副省长
  • 安阳一村支书微信群骂村民被警方行拘,辩称对方先“污蔑造谣”
  • 准85后青海海北州副州长、州公安局局长李贤荣赴山东临沂挂职
  • 影子调查|23岁男子驾照拟注销背后的“被精神病”疑云