Leetcode 79. 单词搜索

news/2024/4/29 0:41:32

在这里插入图片描述

心路历程:

做完这道题才发现是回溯,一开始想的是递归,判断完第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.cpky.cn/p/10770.html

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

相关文章

网络安全(黑客)——2024自学

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

python打开文件并读取文件内容(python readlines读取文件内容)

通过open 方法打开 test .py 文件&#xff0c;以读“ r ”的方式打开。通过 调用readlines() 方法逐行的来读取文件。中的数据 try的语句块中&#xff0c;用 for 循环来逐行的打印 test.py 文件中的数据&#xff0c;每循环一次休眠一下。在 finally 语句块中执行文件的 clos…

主键约束

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 主键约束可以看成是非空约束再加上唯一约束 也就是说设置为主键列&#xff0c;不能为空&#xff0c;不能重复 像一般用户编号是不可能重复的&#xff0c;也不可能为空的 …

【观察】戴尔科技:软件驱动存储创新,全面拥抱AI智能时代

毫无疑问&#xff0c;数字经济已成为稳增长促转型&#xff0c;推动中国经济高质量发展的重要引擎。根据信通院发布的《中国数字经济发展研究报告&#xff08;2023&#xff09;》显示&#xff0c;2022年&#xff0c;我国数字经济规模首次突破50万亿元&#xff0c;达到50.2万亿元…

微信小程序小白易入门基础教程1

微信小程序 基本结构 页面配置 页面配置 app.json 中的部分配置&#xff0c;也支持对单个页面进行配置&#xff0c;可以在页面对应的 .json 文件来对本页面的表现进行配置。 页面中配置项在当前页面会覆盖 app.json 中相同的配置项&#xff08;样式相关的配置项属于 app.js…

设计模式 -- 1:简单工厂模式

目录 代码记录代码部分 代码记录 设计模式的代码注意要运用到面向对象的思想 考虑到紧耦合和松耦合 把具体的操作类分开 不让其互相影响&#xff08;注意这点&#xff09; 下面是UML类图 代码部分 #include <iostream> #include <memory> // 引入智能指针的头文…