LeetCode 每日一刷【79】单词搜索_leetcode 79单词搜索_馆主君晓的博客-程序员秘密

技术标签: dfs  算法  java  leetcode  LeetCode  

​ 话不多说,直接上题目链接,79.单词搜索 。题目描述如下:
1586750169711222.jpg

题目思路

​       这是一道典型的 DFS (深度优先搜索)的题目,深度优先搜索的精髓就是递归,从某个节点开始遍历其邻近的节点,如果邻近的节点被访问过就不再访问,如果邻近的节点没有被访问过,那么就访问邻近的节点,这里的邻近指的是相邻的意思。然后再访问邻近节点的邻近节点,知道节点全部被访问才结束。这是一种图的遍历的方法,与之相对的还广度优先搜索 BFS ,关于广度优先搜索在下一次题目讲解中将会介绍。

       那么这道题我们就用 DFS 来做,首先我们要构造一个深度优先搜索的函数,来对输入的二维网格进行遍历。题目要求是要找到在网格中是否有给定 word 的匹配。我们知道一个 word 里有很多个字母,我们要一个字母一个字母的匹配。而在题目要求:

1586750946382808.jpg

​       也就是说,假如我们在二维数组board [i] [j] 里找到了一个字母和 word 的首字母匹配,然后匹配的第二个字母必须是这个board [i] [j] 的上下左右间距为1,如果没有就返回1。

​       所以我们的思路就很清晰了,首先遍历题目所给 word ,并在二维网格里找到能够匹配到 word 的第一个字母的坐标,然后在这个坐标下,进行上下左右的移动和试探,试图找到能够与 word 的第二个字母匹配的坐标,如果找到了,再在找到的坐标进行上下左右的移动,识图找到能够与 word 第三个字母匹配的坐标。如果找到了继续进行下去,如果没有找到,那么这次匹配失败,再找能够与 word 首字母匹配的坐标。

代码解释

  • 方向数组:用来存储每次 x , y 坐标是如何变化的,比如说 dir[0] [0] 的值就是0,也就是说横坐标变化为0,dir[0] [1] 的值为 -1 也就是说纵坐标变化为 -1 ,也就是说dir[0] 表示的是横坐标不变,纵坐标减一,也就是向上运动一格的操作。dir数组的一维大小为 4 表示 上下左右四个方向。
  • 访问数组:visted ,用来存储元素是否被访问,数组大小和二维网格 board 的大小是一样的。访问置1,未被访问置0。
  • index:表示遍历到的 word 里单词的下标,初始值设为1,表示 word 的第一个字母能够在二维网格中找到,就算没有找到直接返回false,与 index 无关,只有在二维网格中找到了 word 的第一个字母,那么就进行dfs,这个时候 index 才起到作用。
  • 每次遍历都是一种尝试,只有此次尝试成功才能返回 true ,如果此次返回不成功,那么相应的访问数组要恢复原来未被访问,也就是置0。
  • dfs 遍历的时候要注意边界,比如说二维网格的右上角只能向左或者向下进行遍历,不能够向右或者向上进行遍历。所以每次坐标变换的时候要判断这个坐标是否有效,有效我们才能继续进行遍历。

代码

class Solution {
    
    //方向数组
    public static int[][] dir = {
    {
    0,-1},{
    0,1},{
    -1,0},{
    1,0}};
    //从单词的第一个字母开始
    public static int index = 0;
    //访问数组 用来存储元素是否被访问
    public static int[][] visted;
    public boolean exist(char[][] board, String word) {
    
        //特殊处理
        if(word==null || word.equals("")){
    
            return false;
        }
        //初始化visted数组
        int row = board.length;
        int col = board[0].length;
        visted = new int[row][col];
        //初始化index
        index = 1;
        //从图中匹配
        for(int i = 0;i<row;++i){
    
            for(int j = 0;j<col;++j){
    
                //如果未被访问而且匹配到单词的第一个字母
                if(visted[i][j]==0 && board[i][j]==word.charAt(0)){
    
                    visted[i][j] = 1;
                    //从这个字母开始进行第二个字母的匹配
                    if(dfs(i,j,1,word,board)){
    
                        return true;
                    }
                    visted[i][j] = 0;
                }
            }
        }
        return false;
    }

    //dfs 遍历
    public boolean dfs(int x,int y,int deep,String word,char[][] board){
    
        //获取单词长度
        int len = word.length();
        //获取二维网格的行和列
        int row = board.length;
        int col = board[0].length;
        //条件 当到单词末尾 并且最后一个字母也找到
        if(deep==len && board[x][y]==word.charAt(len-1)){
    
            return true;
        }

        //从四个方向上进行遍历
        for(int i = 0;i<4;++i){
    
            int tempx = x + dir[i][0];
            int tempy = y + dir[i][1];
            //边界条件
            if(tempx < 0 || tempy >= col || tempx >= row || tempy < 0 || visted[tempx][tempy]==1 || board[tempx][tempy]!=word.charAt(index)){
    
                continue;
            }else{
    
                //当前访问过的点置1
                visted[tempx][tempy] = 1;
                //匹配下一个字母
                index++;
                if(dfs(tempx,tempy,deep+1,word,board)){
    
                    return true;
                }
                //没有匹配到
                index--;
                visted[tempx][tempy] = 0;
            }
        }
        return false;
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40401866/article/details/105486100

智能推荐

Tomcat Manager 密码问题_OnEstepEnD的博客-程序员秘密

登录到http://localhost:8080页面,当忘记管理员(tomcat manager)帐号与密码时找到tomcat的安装文件夹,在conf文件夹里有一个tomcat-user.xml文件用文本编辑器打开,找到以下标签便是管理员帐号和密码了      //角色      //用户名和密码如果tomcat-users标签里为空值或者全是注释,可以自己按上面的格式

Nginx安装配置详解(二)_chileique7275的博客-程序员秘密

在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络. #使用的用户和组(可以只设置用户而已) user www-data www-data; #启动进程,通常设置成和cpu的数量相等(一般等于CPU的总核数或者总核数的两倍),每个进程耗费10...

添加最少的字符让字符串变为回文字符串(1)_老张你要老婆不要的博客-程序员秘密

添加最少的字符让字符串变为回文字符串(1)题目描述给定一个字符串str,如果可以在str的任意位置添加字符,请返回在添加字符最少的情况下,让str整体都是回文字符串的一种结果。输入描述:输入包含一行字符串,代表str(1≤lengthstr≤5000)str(1 \leq length_{str} \leq 5000)str(1≤lengthstr​≤5000)。输出描述:输出一行,代表返回的字符串。示例1输入ABA输出ABA示例2输入AB输出ABA备注:时间复杂

Linux复制粘贴快捷键_linux怎么复制快捷键_crazy_itman的博客-程序员秘密

1. 在终端下:          复制命令:Ctrl + Shift + C  组合键.          粘贴命令:Ctrl + Shift + V  组合键.  2. 在控制台下:          复制命令:Ctrl + Insert  组合键  或  用鼠标选中即是复制。          粘贴命令:Shift + Insert  组合键  或  单击鼠标滚轮即为

第7课:p、hx、em、strong标签_只想努力的奔跑的博客-程序员秘密

标签,添加段落语法:段落文本标签,为你的网页添加标题标题标签一共有6个,h1、h2、h3、h4、h5、h6分别为一级标题、二级标题、三级标题、四级标题、五级标题、六级标题。并且依据重要性递减。是最高的等级。加入强调语气,使用和标签语法:需要强调的文本 需要强调的文本默认em是斜体,strong是加粗,可以用css改变

python+appium app自动化的方法实例运用_dey87696的博客-程序员秘密

# -*- coding: utf-8 -*-import osimport sysimport timeimport unittestfrom appium import webdriver# from selenium import webdriverfrom HTMLTestRunner import HTMLTestRunnerfrom appium.webdriver.co...

随便推点

计算机程序停止工作怎么办,如何将“某某程序已正常停止工作,请关闭程序”这个提示自动关闭..._weixin_40001275的博客-程序员秘密

你好,“程序停止正常工作。请关闭该程序。”这样的Windows 错误提示弹窗是由微软设计以提醒并帮助解决用户程序及系统问题。如果需要禁止这样的错误报告,可以通过更改本地组策略来实现。步骤如下所示:1.以管理员身份运行gpedit.msc2.计算机配置-&gt;管理模板-&gt;Windows 组件-&gt;Windows 错误报告3.在“禁用Windows 错误报告”上右击,选编辑,从未配置或者已...

【AlexeyAB DarkNet框架解析】三,加载数据进行训练_alexeyab box.c_just_sort的博客-程序员秘密

前言昨天讲了DarkNet的底层数据结构,并且将网络配置文件进行了解析存放到了一个network结构体中,那么今天我们就要来看一下Darknet是如何加载数据进行训练的。加载训练数据DarkNet的数据加载函数load_data()在src/data.c中实现(src/detector.c函数中的train_detector直接调用这个函数加载数据)。load_data()函数调用流程如下:...

织梦列表页调用新增图片字段,用field调用前端显示的不是纯图片路径,含有li、a等前端标签的解决办法_MrLi-2018的博客-程序员秘密

&lt;li&gt; &lt;a href=' http://xin.lingyanghuodong.com/uploads/200924/1-200924102G6157.png' target='_blank'&gt;&lt;img src=' http://xin.lingyanghuodong.com/uploads/200924/1-200924102G6157.png' width='651' border='0'/&gt;&lt;/a&gt; ...

IAR 调试出现“program exit reached"_iar programexit_JawSoW的博客-程序员秘密

IAR主函数中没有循环,程序运行到结尾退出了。

vue-cli初始化项目时localhost打不开_一位仙女的博客-程序员秘密

在用vue-cli脚手架初始化项目时npm run dev 运行后报错说localhost打不开:Error: listen EADDRNOTAVAIL: address not available 175.8.167.49:8080 at Server.setupListenHandle [as _listen2] (net.js:1253:19) at listenInCl...

在中断程序里修改全局变量的童鞋注意啦~(C中的volatile作用 转载~)_中断修改全局变量_颖念的博客-程序员秘密

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:      1). 并行设备的硬件寄存器(如:状态寄存器)      2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic v...

推荐文章

热门文章

相关标签