Python算法题集_单词搜索

Python算法题集_单词搜索

  • 题22:单词搜索
  • 1. 示例说明
  • 2. 题目解析
    • - 题意分解
    • - 优化思路
    • - 测量工具
  • 3. 代码展开
    • 1) 标准求解【原始矩阵状态+回溯】
    • 2) 改进版一【字典检测+原始矩阵状态+回溯】
    • 3) 改进版二【矩阵状态+回溯】
  • 4. 最优算法
  • 5. 相关资源

本文为Python算法题集之一的代码示例

题22:单词搜索

1. 示例说明

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

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

    示例 1:

    img

    输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
    输出:true
    

    示例 2:

    img

    输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
    输出:true
    

    示例 3:

    img

    输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
    输出:false
    

    提示:

    • m == board.length
    • n = board[i].length
    • 1 <= m, n <= 6
    • 1 <= word.length <= 15
    • boardword 仅由大小写英文字母组成

    **进阶:**你可以使用搜索剪枝的技术来优化解决方案,使其在 board 更大的情况下可以更快解决问题?


2. 题目解析

- 题意分解

  1. 本题是在矩阵内检查是否有相邻元素组成对应单词
  2. 矩阵内每一个元素最多有4个方向,考虑到搜索进入方向,从第二个字母开始,最多有3个方向,可以用回溯法解题
  3. 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。

- 优化思路

  1. 通常优化:减少循环层次

  2. 通常优化:增加分支,减少计算集

  3. 通常优化:采用内置算法来提升计算速度

  4. 分析题目特点,分析最优解

    1. 可以使用字典进行字符检测,只有存在检测单词所有字符的矩阵才展开搜索

    2. 可以使用原始矩阵保存检测状态,也可以另外使用矩阵保存检测状态


- 测量工具

  • 本地化测试说明:LeetCode网站测试运行时数据波动很大【可把页面视为功能测试】,因此需要本地化测试解决数据波动问题
  • CheckFuncPerf(本地化函数用时和内存占用测试模块)已上传到CSDN,地址:Python算法题集_检测函数用时和内存占用的模块
  • 本题本地化超时测试用例自己生成,详见章节【最优算法】,代码文件包含在【相关资源】中

3. 代码展开

1) 标准求解【原始矩阵状态+回溯】

使用原始矩阵保存检测状态【当前已检测路径值设置为’'】,实现回溯

页面功能测试,马马虎虎,超过76%在这里插入图片描述

import CheckFuncPerf as cfpclass Solution:def exist_base(self, board, word):def dfs_backtrack(irow, icol, icheckpos):if not 0 <= irow < len(board) or not 0 <= icol < len(board[0]) or \board[irow][icol] != word[icheckpos]:return Falseif icheckpos == len(word) - 1:return Trueboard[irow][icol] = ''result = dfs_backtrack(irow + 1, icol, icheckpos + 1) or \dfs_backtrack(irow - 1, icol, icheckpos + 1) or \dfs_backtrack(irow, icol + 1, icheckpos + 1) or \dfs_backtrack(irow, icol - 1, icheckpos + 1)board[irow][icol] = word[icheckpos]return resultfor irow in range(len(board)):for icol in range(len(board[0])):if board[irow][icol] == word[0] and dfs_backtrack(irow, icol, 0):return Truereturn FalseaSolution = Solution()
checkmapmatrix = copy.deepcopy(mapmatrix)
result = cfp.getTimeMemoryStr(aSolution.exist_base, checkmapmatrix, checkword)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 运行结果
函数 exist_base 的运行时间为 24.00 ms;内存使用量为 684.00 KB 执行结果 = True

2) 改进版一【字典检测+原始矩阵状态+回溯】

使用字典进行字符集检测,符合要求的才开始回溯;回溯中使用原始矩阵保存检测状态

页面功能测试,性能卓越,超越95%在这里插入图片描述

import CheckFuncPerf as cfpclass Solution:def exist_ext1(self, board, word):def preCheck():preDict = {}for chr in word:if chr in preDict:preDict[chr] += 1else:preDict[chr] = 1for arow in board:for achr in arow:if achr in preDict and preDict[achr] > 0:preDict[achr] -= 1for aval in preDict.values():if aval > 0:return Falsereturn Truedef dfs_backtrack(irow, icol, icheckpos):if icheckpos == imaxlen:return Trueif 0 <= irow < imaxrow and 0 <= icol < imaxcol and board[irow][icol] == word[icheckpos]:board[irow][icol] = ''for inextrow, inextcol in (irow, icol + 1), (irow, icol - 1), \(irow + 1, icol), (irow - 1, icol):if dfs_backtrack(inextrow, inextcol, icheckpos + 1):return Trueboard[irow][icol] = word[icheckpos]return Falseif preCheck() == False:return Falseimaxrow, imaxcol, imaxlen = len(board), len(board[0]), len(word)for irow in range(imaxrow):for icol in range(imaxcol):if board[irow][icol] == word[0] and dfs_backtrack(irow, icol, 0):return Truereturn FalseaSolution = Solution()
checkmapmatrix = copy.deepcopy(mapmatrix)
result = cfp.getTimeMemoryStr(aSolution.exist_ext1, checkmapmatrix, checkword)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 运行结果
函数 exist_ext1 的运行时间为 25.01 ms;内存使用量为 644.00 KB 执行结果 = True

3) 改进版二【矩阵状态+回溯】

使用多维列表结构保存检测路径状态,实现回溯

页面功能测试,性能良好,超过88%在这里插入图片描述

import CheckFuncPerf as cfpclass Solution:def exist_ext2(self, board, word):imaxrow, imaxcol, imaxlen = len(board), len(board[0]), len(word)path = [''] * imaxlenmap_check = [[False] * imaxcol for x in range(imaxrow)]def dfs_backtrack(icheckpos, irow, icol, imaxrow, imaxcol, board, word, checkmatrix):if irow < 0 or irow >= imaxrow or icol < 0 or icol >= imaxcol:return Falseif checkmatrix[irow][icol]:return Falseif board[irow][icol] != word[icheckpos]:return Falseif icheckpos == imaxlen - 1:return Truepath[icheckpos] = word[icheckpos]checkmatrix[irow][icol] = Trueif dfs_backtrack(icheckpos + 1, irow - 1, icol, imaxrow, imaxcol, board, word, checkmatrix) or \dfs_backtrack(icheckpos + 1, irow + 1, icol, imaxrow, imaxcol, board, word, checkmatrix) or \dfs_backtrack(icheckpos + 1, irow, icol - 1, imaxrow, imaxcol, board, word, checkmatrix) or \dfs_backtrack(icheckpos + 1, irow, icol + 1, imaxrow, imaxcol, board, word, checkmatrix):return Truecheckmatrix[irow][icol] = Falsepath[icheckpos] = ''return Falsefor irow in range(imaxrow):for icol in range(imaxcol):if dfs_backtrack(0, irow, icol, imaxrow, imaxcol, board, word, map_check):return Truereturn FalseaSolution = Solution()
checkmapmatrix = copy.deepcopy(mapmatrix)
result = cfp.getTimeMemoryStr(aSolution.exist_ext2, checkmapmatrix, checkword)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 运行结果
函数 exist_ext2 的运行时间为 43.01 ms;内存使用量为 384.00 KB 执行结果 = True

4. 最优算法

根据本地日志分析,最优算法为第1种方式【原始矩阵状态+回溯】exist_base

本题测试数据,似乎能推出以下结论:

  1. 字典过滤检测性能消耗极小
  2. 额外的数据存储,带来额外的性能消耗
  3. 在检测集合和字符串多样化的情况下,第二种算法其实是会表现更好
import random, copy
imaxrow, imaxcol, checkword = 500, 300, ''
mapmatrix=[['' for x in range(imaxcol)] for y in range(imaxrow)]
words = list('abcdefghijklmnopqrstuvwxyz')
for irow in range(imaxrow):for icol in range(imaxcol):mapmatrix[irow][icol] = random.choice(words)
for iIdx in range(1, min(imaxrow, imaxcol)):checkword += mapmatrix[imaxrow-iIdx][imaxcol-iIdx] + mapmatrix[imaxrow-iIdx][imaxcol-iIdx-1]
aSolution = Solution()
checkmapmatrix = copy.deepcopy(mapmatrix)
result = cfp.getTimeMemoryStr(aSolution.exist_base, checkmapmatrix, checkword)
print(result['msg'], '执行结果 = {}'.format(result['result']))
checkmapmatrix = copy.deepcopy(mapmatrix)
result = cfp.getTimeMemoryStr(aSolution.exist_ext1, checkmapmatrix, checkword)
print(result['msg'], '执行结果 = {}'.format(result['result']))
checkmapmatrix = copy.deepcopy(mapmatrix)
result = cfp.getTimeMemoryStr(aSolution.exist_ext2, checkmapmatrix, checkword)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 算法本地速度实测比较
函数 exist_base 的运行时间为 24.00 ms;内存使用量为 684.00 KB 执行结果 = True
函数 exist_ext1 的运行时间为 25.01 ms;内存使用量为 644.00 KB 执行结果 = True
函数 exist_ext2 的运行时间为 43.01 ms;内存使用量为 384.00 KB 执行结果 = True

5. 相关资源

本文代码已上传到CSDN,地址:Python算法题源代码_LeetCode(力扣)_单词搜索

一日练,一日功,一日不练十日空

may the odds be ever in your favor ~

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

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

相关文章

DM数据库学习之路(十九)DM8数据库sysbench部署及压力测试

sysbench部署 安装依赖 yum -y install make automake libtool pkgconfig libaio-devel vim-common 上传sysbench源代码 sysbench_tool.tar 测试是否安装成功 $ /opt/sysbench/sysbench-master-dpi/src/lua $ ./sysbench --version sysbench 1.1.0 sysbench测试DM 测试…

jupyter调用envs环境——jupyter内核配置虚拟环境

1.jupyter无法使用envs环境 pycharm的终端打开jupyter notebook&#xff1a; 在kernel下找不到上面的Pytorch_GPU环境&#xff1a; 2.解决方法 在对应的envs环境中安装ipykernel&#xff1a; 将该环境写入jupyter&#xff1a; python -m ipykernel install --user --name Py…

基于分位数回归的长短期记忆神经网络(QRLSTM)的MATLAB实现(源代码)

分位数回归的长短期神经记忆网络介绍&#xff1a; QRLSTM&#xff08;Quantile Regression Long Short-Term Memory&#xff09;分位数回归神经网络是一种结合了长短期记忆&#xff08;LSTM&#xff09;神经网络和分位数回归的模型。这种神经网络结构旨在对数据的不同分位数进行…

Java的四大引用详解-冲击金三银四

强引用 像“Object obj new Object()”这类的引用均为强引用&#xff0c;当一个对象被强引用变量引用时&#xff0c;它处于可达状态&#xff0c;是不可能被垃圾回收器回收的&#xff0c;即使该对象永远不会被用到也不会被回收。 当JVM出现内存不足时&#xff0c;JVM进行垃圾回…

mTLS: openssl创建CA证书

证书可以通过openssl或者keytool创建&#xff0c;在本篇文章中&#xff0c;只介绍openssl。 openssl 生成证书 申请操作流程 生成ca证书私钥, 文件名&#xff1a;ca.key生成ca证书&#xff0c;文件名&#xff1a;ca.crt生成Server/Client 证书私钥&#xff0c;文件名&#x…

设计模式(十三)抽象工厂模式

请直接看原文:设计模式&#xff08;十三&#xff09;抽象工厂模式_抽象工厂模式告诉我们,要针对接口而不是实现进行设计。( )-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- …

live555源码学习(1)

1 基础组件 live项目主要包含了四个基础库、程序入口类&#xff08;mediaServer&#xff09;和测试程序&#xff08;testProgs&#xff09;。四个基础库是UsageEnvironment、BasicUsageEnvironment、groupsock和liveMedia UsageEnvironment 抽象了两个类UsageEnvironment和T…

力扣hot5---双指针

题目&#xff1a; 解决方案&#xff1a;双指针 指针 i 指向最左侧&#xff0c;指针 j 指向最右侧。此时在宽度上达到了最大值&#xff0c;那么哪个柱子更矮&#xff0c;哪个柱子向内部移动&#xff0c;知道 i 与 j 相遇。为什么呢&#xff1f; 如果哪个哪个柱子更矮&#xff0c…

代码随想录算法训练营第四十一天|198.打家劫舍,213.打家劫舍II,337.打家劫舍III

系列文章目录 代码随想录算法训练营第一天|数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 代码随想录算法训练营第二天|977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II 代码随想录算法训练营第三天|链表理论基础&#xff…

【计算机毕业设计】208基于SSM的在线教育网站

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

逆向案例四、进阶,爬取精灵数据咨询前五十页数据

python代码示例: import csv import execjs import requests f open(精灵数据.csv,w,encodingutf-8,newline) csv_writer csv.DictWriter(f,fieldnames[标题,发布时间,新闻来源,详情页链接,转自,点击量,新闻作者,发布时间小时,]) csv_writer.writeheader() data [] for pa…

【Ansys Fluent Web 】全新用户界面支持访问大规模多GPU CFD仿真

基于Web的技术将释放云计算的强大功能&#xff0c;加速CFD仿真&#xff0c;从而减少对硬件资源的依赖。 主要亮点 ✔ 使用Ansys Fluent Web用户界面™&#xff08;UI&#xff09;&#xff0c;用户可通过任何设备与云端运行的仿真进行远程交互 ✔ 该界面通过利用多GPU和云计算功…

理解python3中的回调函数

百度百科说&#xff1a;回调函数就是一个通过函数指针调用的函数。如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来调用其所指向的函数时&#xff0c;我们就说这是回调函数。回调函数不是由该函数的实现方直接调用&#…

Sqli-labs靶场第13关详解[Sqli-labs-less-13]

Sqli-labs-Less-13 #手工注入 post传参了 根据题目看&#xff0c;像一个登录页面&#xff0c;尝试使用布尔型盲注测试能否登录网站 1. Username输入a 测试是否会有报错&#xff0c;burp抓包 报错&#xff1a;syntax to use near a) and password() LIMIT 0,1 at line 1 分…

【04】C语言括号匹配问题

欢迎来到土土的博客~&#x1f973;&#x1f973;&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1f4a5; 所属专栏&#xff1a;C语言系列函数实现 题目描述&#xff1a; 给定一个只包括 ‘(’&#xff0c;‘)’&#xf…

加密隧道技术

在现在的互联网上传输数据&#xff0c;首要考虑的就是安全。这关乎到你的隐私&#xff0c;个人信息&#xff0c;财产安全等等重大问题。如果你的程序本身传输的信息没有加密&#xff0c;也可以通过其他辅助方式让你的通信加密。一些工具的就是为了解决这样的场景的&#xff0c;…

C++ //练习 10.22 重写统计长度小于等于6 的单词数量的程序,使用函数代替lambda。

C Primer&#xff08;第5版&#xff09; 练习 10.22 练习 10.22 重写统计长度小于等于6 的单词数量的程序&#xff0c;使用函数代替lambda。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /********************************…

YOLOv8有效涨点,添加GAM注意力机制,使用Wise-IoU有效提升目标检测效果

目录 摘要 基本原理 通道注意力机制 空间注意力机制 GAM代码实现 Wise-IoU WIoU代码实现 yaml文件编写 完整代码分享&#xff08;含多种注意力机制&#xff09; 摘要 人们已经研究了各种注意力机制来提高各种计算机视觉任务的性能。然而&#xff0c;现有方法忽视了…

【C/C++随笔】static 的用法和作用

「前言」所有文章已经分类好&#xff0c;放心食用 「归属专栏」C语言 | C嘎嘎 「主页链接」个人主页 「笔者」枫叶先生(fy) static 的用法和作用&#xff1f;&#xff1f;&#xff1f; static作用&#xff1a; 作用1修改存储方式&#xff1a;用 static 修饰的变量存储在静态区…

项目解决方案: 实时视频拼接方案介绍(中)

目 录 1.实时视频拼接概述 2.适用场景 3.系统介绍 4. 拼接方案介绍 4.1基于4K摄像机的拼接方案 4.2采用1080P平台3.0 横向拼接 4.2.1系统架构 4.2.2系统功能 4.2.3方案特色 4.2.4适用场景 4.2.5设备选型 4.3纵横兼顾&#xff0c;竖屏拼接 4.3.1系统…