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 Falsevisited = []# print(pos_first)# @cache 回溯不能cachedef dfs(i, j, k):  # 上一个字母的位置是i,j; 此时判断第k个字母在不在其i,j的邻域中assert k > 0if k == len(word):return Truenonlocal 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 = Falsefor 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 flagres = Falsefor 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯---代分数

import java.util.Scanner;public class top4 {//全排列分数的那个题目//首先进行n个数的全排列//然后将这n个数字拆分为3个数字&#xff0c;即插入两个板子//然后判断等式是否成立&#xff08;判断条件就是在if里面去进行相关的判断是吗&#xff1f;&#xff1f;&#xff09;s…

Spring项目部署到linux上

目录 一、环境配置 1、数据准备 2、程序配置文件修改 二、打包项目 三、上传jar包到服务器 四、开放端口号 五、运行程序 六、查看日志 七、常见问题 1、服务未启动 2、端口号已被占用 3、端口未开放 一、环境配置 1、数据准备 需要先在linux环境下的数据库中创建…

【前端】input表单 type属性详解

前言 前端页面开发中&#xff0c;html表单是网页中最常见元素之一&#xff0c;通过form元素定义表单,表单中包含各种表单项。 input 元素可以用来生成一个供用户输入数据的简单文本框。 在默认的情况下&#xff0c; 什么样的数据均可以输入。而通过不同的type属性值&#xff…

代码随想录算法训练营第四十五天|动态规划|70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数

70. 爬楼梯 &#xff08;进阶&#xff09; 文章 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 < m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整数。 输入描述&#xff1a;输入共一行&…

Go语言之函数、方法、接口

一、函数 函数的基本语法&#xff1a; func 函数名&#xff08;形参列表&#xff09;&#xff08;返回值列表&#xff09; {执行语句...return 返回值列表 } 1.形参列表&#xff1a;表示函数的输入 2.函数中的语句&#xff1a;表示为了实现某一功能的代码块 3.函数可以有返回…

安卓基础面试题

自定义view Android自定义View-CSDN博客 view和viewgroup View和ViewGroup的区别- view的事件分发 事件分发详解---历史最容易理解 组件化 Android-组件化开发 什么是ANR Android ANR详解-CSDN博客 Android性能优化 Android 优化-CSDN博客 Aroute 原理 Arouter框架原理…

mysql逗号分隔字段拆成行简述

概述 在实际业务中总有一些字段内容是逗号分隔的&#xff0c;然后后续业务需要扩展时就很难受&#xff1b; 所以一般在这种情况下都是需要建立关联表&#xff0c;将字段内容拆分&#xff1b; 当前使用mysql版本 8.0.32 拆分demo 这里要注意mysql.help_topic表的记录行数&a…

【Linux】进程排队的理解进程状态的表述僵尸进程和孤儿进程的理解

一、进程排队的理解 进程不是一直运行的&#xff0c;进程可能会在等待某种软硬件资源。即使把进程加载到CPU中&#xff0c;也不是一直会运行的。而进程排队&#xff0c;一定是在等待某种软硬件资源&#xff08;可以是CPU&#xff0c;键盘&#xff0c;磁盘&#xff0c;网卡等等设…

rabbitmq-spring-boot-start配置使用手册

rabbitmq-spring-boot-start配置使用手册 文章目录 1.yaml配置如下2.引入pom依赖如下2.1 引入项目resources下libs中的jar包依赖如下2.2引入maven私服依赖如下 3.启动类配置如下4.项目中测试发送消息如下5.项目中消费消息代码示例6.mq管理后台交换机队列创建及路由绑定关系如下…

PyTorch学习笔记之基础函数篇(九)

文章目录 统计运算5.1 torch.mean()函数5.2 torch.median()函数5.3 torch.sum()函数5.4 torch.prod()函数5.5 torch.std()函数5.6 torch.var()函数 统计运算 5.1 torch.mean()函数 torch.mean() 是 PyTorch 中的一个函数&#xff0c;用于计算张量&#xff08;Tensor&#xff…

深入探讨Python中的文件操作与文件IO操作【第141篇—Python实现】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 深入探讨Python中的文件操作与文件IO操作 在Python编程中&#xff0c;文件操作和文件IO操作…

ES集群和分片以及脑裂

文章目录 概要一、概念二、节点角色三、master节点脑裂四、参考 概要 在工作中不可避免会用到ES&#xff0c;而用到ES就不得使用其集群模式了。 单节点的话不得不面临两个重大缺陷&#xff1a;单点故障&#xff08;高可用&#xff09;和海量数据存储搜索。 ES通过集群模式解决…

数据库增删改查复习

增删改查 插入数据 #插入一行 insert into student values(xwz,男&#xff0c;18); #插入多行数据 insert into student values(xwz,男&#xff0c;18)&#xff0c;(jesse,女,12); #插入行的一部分 insert into studnet(name,gender,age) values(xwz,男,18) #插入查询出来的数…

使用动态日志简化开发时间

1.游戏日志的重要性 日志,无论是对于开发环境,还是生产环境,都有着非常重要的作用,具体如下: 跟踪和记录应用程序的运行状态,以便进行故障排查和问题定位。提供应用程序的运行性能数据,以便优化和改进应用程序的性能。收集用户行为和反馈,以便进行用户行为分析和用户体…

JSR规范系列(6)——Jakarta EE 9 规范

Jakarta EE 9 规范 Jakarta EE 9 规范 JSR规范系列&#xff08;1&#xff09;——Java版本、JSR规范和JCP社区流程概述 JSR规范系列&#xff08;2&#xff09;——JavaSE规范、JavaEE规范、JSR规范全面整理——截止201908 JSR规范系列&#xff08;3&#xff09;——Java EE 6规…

Pots

给你两个容量分别为 A 升和 B 升的罐子。可以进行以下操作&#xff1a; FILL(i) 从水龙头向罐子 i&#xff08;1 ≤ i ≤ 2&#xff09;灌满水&#xff1b;DROP(i) 把罐子 i 的水倒空&#xff1b;POUR(i,j) 从罐子 i 向罐子 j 倒水&#xff1b;此操作后&#x…

● 647. 回文子串 ● 516.最长回文子序列 ● 动态规划总结篇

● 647. 回文子串 1.dp数组含义。 之前的题目&#xff0c;差不多都是求什么就怎么定义dp数组&#xff0c;最后返回dp的最后一个元素。但是这里如果定义一维数组dp[i]是[0,i]范围的回文子串的个数的话&#xff0c;怎么根据dp[i-1]得到dp[i]&#xff1f;发现很难找到递归关系…

Linux之gcc_makefile

一、提要 1. 预处理&#xff08;进行宏替换) 2. 编译&#xff08;生成汇编) 3. 汇编&#xff08;生成机器可识别代码&#xff09; 4. 链接&#xff08;生成可执行文件或库文件) 五六十年代&#xff0c;我们编程大多是二进制编程&#xff0c;也就是使用打孔纸带喂给机器 再往后&…

118.Qt入门,实现一个图片查看软件

需要用到的控件 QLabelQLineEditQPushButton 需要实现的功能 打开目录选择图片显示图片的名字显示图片 QLabel基本用法 void setText(const QString &);//设置文本QString text() const;//获取文本void setPixmap(const QPixmap &);设置大小 使用父类QWidget的方法设置…

窗口函数(sample database classicmodels _No.8 )

窗口函数&#xff08;sample database classicmodels _No.8 &#xff09; 准备工作&#xff0c;可以去下载 classicmodels 数据库具体如下 点击&#xff1a;classicmodels 也可以去 下面我的博客资源下载 https://download.csdn.net/download/tomxjc/88685970 文章目录 窗口函…