LeetCode第79题:单词搜索

2023-11-19

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

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/word-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

解题思路:

         用深度优先遍历DFS的思想,构造一个递归函数dfs。传递矩阵信息、某个格子的位置(x,y),以及要匹配的单词word和匹配开始字符位置pos。即从mat[x][y] 寻找是否有word[pos]往后的单词,存在则匹配成功,返回true。

        因为格子不能重复使用,所以要建立一个visit[m][n]的数组,记录格子是否被用过。

        dfs函数介绍:

        1、进来先判断mat[x][y] 是否等于 word[pos] ,visit[x][y] 是否等于1?不相等或者该格子被用过则直接返回false;

        2、单个字母匹配成功,再判断是否是最后一个字符,是的话返回true,找到了这个单词。

        3、还不是最后一个单词,先将visit[x][y] = 1(表明用了这个格子)。接下来要向四个方向查找后面的字符,遍历上下左右四个格子,递归调用dfs函数查找,传递的参数中,(x,y)变为新格子的位置,pos= pos+ 1(从下一个字母开始匹配)。

        4、如果四个方向上,有返回true的话,直接返回true。若4个方向都返回false,都没找到,则应回溯。将本格子visit[x][y] = 0;再返回false即可。

//上下左右四个方向
const int dx[4] = {0,1,0,-1};
const int dy[4] = {1,0,-1,0};

//递归查找
bool dfs(char** board,int** visit,int m,int n,int x,int y,int pos,char* word,int len){
    if(board[x][y] != word[pos] || visit[x][y] == 1)
        return false;
    if(pos == (len - 1))
        return true;
    visit[x][y] = 1;
    int new_x,new_y;
    for(int k = 0;k<4;k++){
        new_x = x + dx[k];
        new_y = y + dy[k];
        if(new_x < 0 || new_x >= m || new_y < 0 || new_y >= n)
            continue;
        else
            if(dfs(board,visit,m,n,new_x,new_y,pos+1,word,len))
                return true;
    }
    visit[x][y] = 0;
    return false;
}

bool exist(char** board, int boardSize, int* boardColSize, char * word){
    int m = boardSize,n = boardColSize[0];
    int len = strlen(word);
    if(len == 0)
        return true;
    //visit 标记是否被访问过   初始化为0
    int** visit = malloc(sizeof(int*) * m);
    for(int k = 0;k<m;k++){
        visit[k] = malloc(sizeof(int)*n);
        for(int t = 0;t<n;t++)
            visit[k][t] = 0;
    }
    
    for(int i =0;i<m;i++)
        for(int j =0;j<n;j++){
            if(board[i][j] != word[0])
                continue;
            else
                if(dfs(board,visit,m,n,i,j,0,word,len))
                    return true;
        }
    return false;
}

运行结果如下:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode第79题:单词搜索 的相关文章

随机推荐

  • 【C++自我精讲】基础系列四 static

    C 自我精讲 基础系列四 static 0 前言 变量的存储类型 存储类型按变量的生存期划分 分动态存储方式和静态存储方式 1 动态存储方式的变量 生存期为变量所在的作用域 即程序运行到此变量时才为其分配存储空间 作用域结束时 会自动收回为
  • 企业支付宝白名单和数字娱乐线上接口解析。

    企业支付宝白名单 企业支付宝白名单是指企业在支付宝平台上享受更多支付和服务权限的一种认证机制 通过加入支付宝白名单 企业可以获得更高的交易额度 更灵活的支付功能和更便捷的服务 具体来说 企业支付宝白名单的好处包括 提升支付额度 白名单企业可
  • unzip命令常用参数

    1 l 显示压缩文件内所包含的文件 2 t 检查压缩文件是否正确 3 o 不必先询问用户 unzip执行后覆盖原有的文件 4 n 解压缩时不要覆盖原有的文件 5 q 执行时不显示任何信息 6 d lt 目录 gt 指定文件解压缩后所要存储的
  • redis进行set操作时异常总结

    事情经过 项目中使用redis 环境进行过一次网络迁移 之后就无法拿到redis连接 1 先通过ping命令排除网络原因 其实这里建议使用 telnet 命令 格式 telnet ip port 不仅能排查网络是否连通并且知道改端口号是否能
  • PTA-ASCII码实战

    给出一系列字符 有大小写英文字母和其他一些字符 仅涉及ASCII打印字符 即ASCII码值 gt 32 现在想让你鉴别以下这些字符 如果是英文字母则输出其ASCII码值 否则输出 illegal 不包含引号 输入格式 第一行一个整数N 0
  • 详解Singleton、Factory、Strategy在项目中的应用

    一 前言 前几天阅读一框架文档 里面有一段这样的描述 从对象工厂中 促使写下本文 尽管一些模式简单和简单 但是常用 有用 结合最近一个项目场景回顾一下里面应用到的一些模式 Singleton Factory Strategy Singlet
  • pm2的的使用(基础)

    技术背景 相信大家都有这样一个烦恼 自己写了一个服务 并且通过cmd面板开启了这个服务 可是 当你关掉cmd命令行面板的时候 你会发现你的服务也跟着停止了 这种现象是我们不想要的 所以 诞生了一种技术 pm2服务持久化管理 技术的简单使用
  • SQL主键与外键的创建与解析

    一个表中 会存很多条记录 需要一个列来位置标识一条数据 1 主键 唯一标识一条数据 值不能为空 不能重复 标识列 一旦将一个列设置成标识列 它就不能再手动输入值 是插入数据时自动生成的 这个列的类型必须的不带小数的数值型 整型 标识列的标识
  • 利用搜索关键字爬取今日头条新闻评论信息案例

    利用搜索关键字爬取今日头条新闻评论信息案例 爬虫4步骤 1 分析网页 2 对网页发送请求 获取响应 3 提取解析数据 4 保存数据 本案例所用到的模块 import requests import time import csv 案例网址
  • centos 添加路由命令_centos路由添加route命令

    方法一 添加路由 route add net 192 168 0 0 24 gw 192 168 0 1 route add host 192 168 1 1 dev 192 168 0 1 删除路由 route del net 192 1
  • C++连接sqlserver

    项目结构 ConsoleApplication cpp include
  • KeyError: Spider not found (Scrapy)

    在初次使用Scrapy框架时 突然蹦出了一个bug 看了一下午还没解决 吃过晚饭后灵光一现嘿嘿 终于解决了 出现的具体bug如下 自己觉得是路径问题 就一步一步的cd到myspider 自己定义的文件名 文件下 再次运行 结果又出现了下面的
  • 用Java实现五子棋对弈

    目录 题目展示 题目分析 代码实现 结果展示 题目展示 1 使用二维数组存储五子棋棋盘 如下图 2 在控制台通过Scanner输入黑白棋坐标 表示二维数组坐标 使用实心五角星和空心五角星表示黑白棋子 如下图 输入后重新输出棋盘如下图 白棋输
  • MySQL表的操作

    MySQL表的操作 创建表 查看表结构的详细信息 修改表结构 增加表结构属性 删除表结构 表结构的修改 删除表结构 创建表 语法 create table table name field1 datatype comment xxxxx f
  • 多线程太可怕了

    今天发现了一个多线程引起的bug 然后进一步体会到 这东西太容易出问题了 首先要说明的是 出问题的代码可不是一般人写的 是由一个叫EPAM systems的世界知名外包公司的人写的 这些java程序员个个经验丰富 心高气傲 貌似base在乌
  • 久坐不运动易导致低血压

    近年来 越来越多的年轻人患上了体质性低血压 大多是由于久坐不运动和营养不 够 两大原因造成的 现在 不少年轻人缺乏体育锻炼 一天到晚屁股总粘着凳子 久而久之 血管的活动也随之减少 使得血管的反应能力慢慢变差 一个简单的蹲下 站立动作也会使得
  • SEM代码篇----R详细实现(SEM 2)

    SEM代码篇 R详细实现 1 step1 安装包 install packages lavaan install packages semPlot install packages semTools rm list ls 清除所有变量 li
  • Doris节点扩容及数据表

    扩容和缩容 上篇文章简单讲了doris的安装 本章分享的是doris中fe和be节点的扩容缩容以及doris的数据表 1 FE 扩容和缩容 使用 MySQL 登录客户端后 可以使用 sql 命令查看 FE 状态 目前就一台 FE mysql
  • git学习心得

    git是一款十分有用的版本控制软件 程序员必备 http www liaoxuefeng com wiki 0013739516305929606dd18361248578c67b8067c8c017b000 001374325691607
  • LeetCode第79题:单词搜索

    给定一个 m x n 二维字符网格 board 和一个字符串单词 word 如果 word 存在于网格中 返回 true 否则 返回 false 单词必须按照字母顺序 通过相邻的单元格内的字母构成 其中 相邻 单元格是那些水平相邻或垂直相邻