Leetcode 79. 单词搜索

在这里插入图片描述

心路历程:

做完这道题才发现是回溯,一开始想的是递归,判断完第i个字符后,只需要挨个判断第i+1个字符在不在第i个字符的邻域。后来发现由于不能重复使用元素,所以需要维护一个visited列表,并且在遍历所有可能组合的时候还得撤回之前的选择。
回过头来从回溯的角度思考这个问题:每个边(路径)可以看作是选择哪个字母,候选集合就是当前邻域(结点)。相当于‘选哪个’的问题。

注意的点:

1、题目中要求字符不能重复选择,因此需要维护一个visited,并且需要在遍历结束后撤销选择。
2、debug时可以打印每个结点的值来看递归函数执行的正确性。

解法: 回溯

因为一开始以为是DP问题,所以为了后面用cache装饰器方便而参数化了递归函数的输入,写完后发现其实代码可以简化,可以把首字母的可选邻域看作整个board。

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        # 递归

        # 获取第一个单词的所有可能位置和其邻域
        first = word[0]
        pos_first = []
        m = len(board)
        n = len(board[0])
        for i_ in range(m):
            for j_ in range(n):
                if board[i_][j_] == first:
                    pos_first.append((i_, j_))
        if not pos_first:
            return False
        visited = []
        # print(pos_first)
        # @cache 回溯不能cache
        def dfs(i, j, k):  # 上一个字母的位置是i,j; 此时判断第k个字母在不在其i,j的邻域中
            assert k > 0
            if k == len(word):
                return True
            nonlocal m, n, board
            # 先求i,j的邻域
            linyu = []
            if i + 1 <= m - 1:
                linyu.append([i+1, j])
            if i - 1 >= 0:
                linyu.append([i-1, j])
            if j + 1 <= n - 1:
                linyu.append([i, j+1])
            if j - 1 >= 0:
                linyu.append([i, j-1])
            flag = False
            for eve in linyu:
                if board[eve[0]][eve[1]] == word[k] and (eve[0], eve[1]) not in visited:
                    visited.append((eve[0], eve[1]))
                    flag = flag or dfs(eve[0], eve[1], k+1)
                    visited.pop()
            # print(i,j,k,flag, linyu, visited)
            return flag

        res = False
        for each_init in pos_first:
            visited.append((each_init[0], each_init[1])) # 因为不能重复选择字母
            res = res or dfs(each_init[0], each_init[1], 1)
            visited.pop()

        return res

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/469793.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式3-19

1、哈希表的代码写完&#xff0c;写出给出关键字&#xff0c;找到该关键字在哈希表(指针数组)中下标的位置&#xff0c;以及在链表中的位置。(因为返回值只有一个&#xff0c;所以结果直接找到通过输出语句输出) void search(node *H,int key); 2、快速排序和折半查找的代码写…

Maven项目如何导入依赖包

一、导入依赖包 导入mysql依赖包 第一步&#xff1a;登录Maven官网 Maven官网&#xff1a;https://mvnrepository.com/search?qmysql 第二步&#xff1a;点击MySql Connector Java 第三步&#xff1a;点击任意一个版本 第四步&#xff1a;将以下内容复制到pom.xml中 导入j…

Unity发布webgl设置占满浏览器运行

Unity发布webgl设置占满浏览器运行 Unity发布webgl的时候index.html的模板文件 模板文件路径&#xff0c;根据自己的需求修改。 C:\Program Files\Unity\Hub\Editor\2021.1.18f1c1\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\WebGLTemplates\Default再桌面新建一个t…

随笔-生老病死

周末两天也没有出门&#xff0c;帮着一个朋友做了些图&#xff08;就这两天忙不过来&#xff09;&#xff0c;挣了点外快&#xff08;700&#xff09;&#xff0c;累得腰酸、眼花、脖子疼。 媳妇带着小孩出去玩&#xff0c;中间发了个视频&#xff0c;是小孩进了一个围棋培训班…

HTML基础:列表标签的3种形式以及嵌套列表

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端程序媛。 g.zh后台回复“前端工具”可免费获取开发工具&#xff0c;持续更新 今天聊聊列表标签。列表标签&#xff0c;在网页设计中可以帮助将信息以结构化的方式呈现给用户&#xff0c;提高信息的可读性…

在线教育平台帮助教培机构打造线上

随着互联网的迅猛发展&#xff0c;在线教育逐渐成为了教育行业的主流趋势。为了满足教育机构和学生对高效、便捷在线教育的需求&#xff0c;乔拓云教育系统应运而生。该系统以学员端展示课程和后台管理教务为核心功能&#xff0c;为教育机构提供了一站式解决方案&#xff0c;助…

母亲的奶牛(bfs)

农夫约翰有三个容量分别为 A , B , C A,B,C A,B,C 升的挤奶桶。 最开始桶 A A A 和桶 B B B 都是空的&#xff0c;而桶 C C C 里装满了牛奶。 有时&#xff0c;约翰会将牛奶从一个桶倒到另一个桶中&#xff0c;直到被倒入牛奶的桶满了或者倒出牛奶的桶空了为止。 这一过…

晶圆制造过程中常用载具的类型

晶圆载具用于硅片生产、晶圆制造以及工厂之间晶圆的储存、传送、运输以及防护。晶圆载具种类很多,如FOUP用于晶圆制造工厂中晶圆的传送;FOSB用于硅片生产与晶圆制造工厂之间的运输;CASSETTE载具可用于工序间运送以及配合工艺使用。 OPEN CASSETTE OPEN CASSETTE主要在晶圆…

实战http请求

文章目录 使用python3的标准库发起GET请求使用python3的标准库发起POST请求使用requests库发起GET请求使用requests库发起POST请求使用java 11内置的http client发起访问百度请求使用java 11内置的http client发起访问POST请求进一步阅读与参考资料 使用python3的标准库发起GET…

3.19学习总结

一.题解分析 这是一道bfs的题目,初看毫无头绪,经过点拨后恍然大悟,我们需要记录其六个操作,对每次选择时每个操作进行入队检查,最终得到任意一个罐子里的水等于c,记录其总操作步数,并进行输出.这里的操作类似于走迷宫时,我们设置的方向数组.然后我们在输出操作时,可以用一个数组…

1-postgresql数据库高可用脚本详解

问题&#xff1a; pgrep -f postgres > /dev/null && echo 0 || pkill keepalived 这是什么意思 建议换成 pgrep -f postmaster > /dev/null && echo 0 || pkill keepalived 回答 这条命令是一个复合命令&#xff0c;包含条件执行和重定向的元素。让我们…

Springboot+Redis:实现缓存 减少对数据库的压力

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏Redis实战与进阶 本专栏讲解Redis从原理到实践 …

根据自己的想法去模拟实现库函数(1)

由于最近比较忙&#xff0c;导致好久没更新了。想我没&#xff1f;嘻嘻&#xff0c;不闹了&#xff0c;开始我们今天的小课堂吧&#xff01; 什么&#xff0c;你想上课走神&#xff1f;小心二叔给你梳头哦&#xff01; 那么这篇文章就先带大家去模拟一下strlen这个函数吧。 st…

01 JDBC介绍

文章目录 JDBC本质版本使用核心APIDriverDriverManager驱动注册连接对象获取 Connection获取执行对象事务管理 Statement概述 ResultSet概述 JDBC本质 官方&#xff08;sun公司&#xff09;定义的一套操作所有关系型数据库的规则&#xff0c;即接口各个数据库厂商去实现这套接…

利用Python爬虫获取xx数据

目录 一、前言 二、requests 请求库 1、requests 安装 2、requests 的基本使用 三、Beautiful Soup 1、Beautiful Soup 安装 2、BeautifulSoup对象介绍与创建 3、BeautifulSoup对象的find方法 四、总结 一、前言 什么是爬虫&#xff1f; 网络爬虫&#xff08;又被称为…

外键约束

目录 外键约束 对数据表进行初期设计&#xff0c;暂时不使用外键 验证限制三 验证级联删除 设置级联更新 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 外键约束 外键约束主要是在父子表关系中体现的一种约束操作。…

【C++】string 类---字符判断与大小写转换(超详细解析!)

目录 一、string 类的介绍 二、字符大小写转换与判断常用函数 &#x1f4a6; 字符大小写判断 ① isalpha() ② isalnum() ③ isdigit() ④ islower() ⑤ isupper() &#x1f4a6; 字符大小写转换 ① tolower() ✨方法一&#xff1a; ✨方法二&#xff1a; ② toupper() ✨方…

实现:mysql-5.7.42 到 mysql-8.2.0 的升级(二进制方式)

实现&#xff1a;mysql-5.7.42 到 mysql-8.2.0 的升级&#xff08;二进制方式&#xff09; 1、操作环境1、查看当前数据库版本2、操作系统版本3、查看 Linux 系统上的 glibc&#xff08;GNU C 库&#xff09;版本&#xff08;**这里很重要&#xff0c;要下载对应的内核mysql版本…

Java之全体集合!

介绍 容器&#xff0c;就是可以容纳其他Java对象的对象。Java Collections Framework(JCF)为Java开发者提供了通用的容器&#xff0c;其始于JDK 1.2.优点是: 降低编程难度提高程序性能提高API间的互操作性降低学习难度降低设计和实现相关API的难度增加程序的重用性 Java容器里…

JavaSE-09笔记【异常(+2024新)】

文章目录 1. 异常概述2.异常继承结构2.1 编译时异常和运行时异常区别2.2 如何让异常发生&#xff08;throw关键字&#xff09; 3.自定义异常4.异常的处理4.1 第一种处理方式&#xff1a;声明异常 &#xff08;throws关键字&#xff09;4.2 第二种处理方式&#xff1a;捕捉异常 …