当前位置: 首页 > wzjs >正文

ps做网站 大小百度指数平台官网

ps做网站 大小,百度指数平台官网,网站销售流程,手机网站 返回顶部LeetCode 热题 100 | 79. 单词搜索 大家好,今天我们来解决一道经典的算法题——单词搜索。这道题在 LeetCode 上被标记为中等难度,要求判断一个字符串 word 是否存在于一个二维字符网格 board 中。单词必须通过相邻单元格内的字母构成,相邻单…

LeetCode 热题 100 | 79. 单词搜索

大家好,今天我们来解决一道经典的算法题——单词搜索。这道题在 LeetCode 上被标记为中等难度,要求判断一个字符串 word 是否存在于一个二维字符网格 board 中。单词必须通过相邻单元格内的字母构成,相邻单元格可以是水平或垂直方向的,且同一个单元格内的字母不能被重复使用。


问题描述

给定一个 m x n 的二维字符网格 board 和一个字符串 word,判断 word 是否存在于网格中。

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

解题思路

核心思想
  1. 深度优先搜索(DFS)

    • 从网格的每个单元格开始,尝试匹配单词的第一个字符。
    • 如果匹配成功,递归地搜索相邻单元格,匹配单词的下一个字符。
  2. 避免重复访问

    • 使用一个临时标记(如 '''0')将已访问的单元格标记为不可用,搜索完成后恢复其值。
  3. 剪枝优化

    • 如果当前路径无法匹配单词,立即回溯,避免无效搜索。
    • 提前检查单词中的字符是否在网格中出现足够的次数,如果不足,直接返回 false
  4. 优化搜索方向

    • 如果单词的最后一个字符在网格中出现次数较少,可以将单词反转后再搜索,减少搜索路径。

Python代码实现

class Solution:def exist(self, board, word):""":type board: List[List[str]]:type word: str:rtype: bool"""def dfs(i, j, k):# 如果超出边界或当前单元格不匹配,返回 Falseif not (0 <= i < len(board) and 0 <= j < len(board[0])) or board[i][j] != word[k]:return False# 如果匹配到单词的最后一个字符,返回 Trueif k == len(word) - 1:return True# 标记当前单元格为已访问temp, board[i][j] = board[i][j], ''# 搜索上下左右四个方向res = dfs(i + 1, j, k + 1) or dfs(i - 1, j, k + 1) or dfs(i, j + 1, k + 1) or dfs(i, j - 1, k + 1)# 恢复当前单元格的值board[i][j] = tempreturn res# 预剪枝:检查单词中的字符是否在网格中出现足够的次数from collections import Counterboard_chars = Counter(ch for row in board for ch in row)word_chars = Counter(word)if any(board_chars[ch] < word_chars[ch] for ch in word_chars):return False# 如果单词的最后一个字符在网格中出现次数较少,反转单词if board_chars[word[-1]] < board_chars[word[0]]:word = word[::-1]# 遍历网格的每个单元格,尝试匹配单词for i in range(len(board)):for j in range(len(board[0])):if dfs(i, j, 0):return Truereturn False

代码解析

  1. DFS 函数

    • dfs(i, j, k) 表示从网格的 (i, j) 位置开始,匹配单词的第 k 个字符。
    • 如果当前单元格超出边界或不匹配,返回 False
    • 如果匹配到单词的最后一个字符,返回 True
    • 使用临时标记避免重复访问,搜索完成后恢复单元格的值。
  2. 剪枝优化

    • 在开始搜索前,检查单词中的每个字符是否在网格中出现足够的次数。如果不足,直接返回 false
  3. 优化搜索方向

    • 如果单词的最后一个字符在网格中出现次数较少,可以将单词反转后再搜索,减少搜索路径。
  4. 遍历网格

    • 从网格的每个单元格开始,调用 dfs 函数尝试匹配单词。

复杂度分析

  • 时间复杂度:O(M × N × 4^L),其中 MN 是网格的行数和列数,L 是单词的长度。
  • 空间复杂度:O(L),递归的深度最大为单词的长度。

示例运行

示例 1
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
示例 2
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
输出:true
示例 3
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
输出:false

总结

通过深度优先搜索(DFS)和剪枝优化,我们可以高效地解决单词搜索问题。这种方法在网格较大时也能快速返回结果,避免不必要的搜索。希望这篇题解对大家有所帮助,如果有任何问题,欢迎在评论区留言讨论!

关注我,获取更多算法题解和编程技巧!

http://www.dtcms.com/wzjs/196353.html

相关文章:

  • 做家装的设计公司网站舆情管理
  • 长沙建站网站百度入口
  • 网站制作熊猫建站宁波seo深度优化平台有哪些
  • 网站代办备案驾校推广网络营销方案
  • 福州企业网站建设推广萝卜建站
  • 快站淘客湛江seo推广外包
  • 百度推广送的公司网站有什么用宁波 seo整体优化
  • 百度做的网站能优化吗百度霸屏推广一般多少钱
  • 金湾网站建设仿站定制模板建站
  • 100个最好的微信小程序关键词排名优化品牌
  • 做奶茶店网站外贸网站推广与优化
  • 昌都网站建设广东今天新闻最新消息
  • 中文域名网站骗局seo百度关键词排名
  • 秭归建设局网站合肥网站推广公司
  • 昆明好的网站制作百度关键词点击排名
  • wordpress系统架构图企业seo排名外包
  • 建设网站的原则推广普通话
  • 网站备案都审核什么国外网站推广平台有哪些?
  • 怎么用挂靠的公司做网站网店推广方式有哪些
  • 北京网站建设好不好天网络营销swot分析
  • 做网站除了dw免费网站怎么注册
  • 上海网站设计开发公司常用的网络营销工具
  • 哪个网站可以做线上翻译赚钱企业怎么做好网站优化
  • 南京网站建设价格深圳seo顾问
  • 网站建设业务员提成色盲测试图第六版及答案大全
  • 做推广哪个网站好申请百度账号注册
  • 德吉机械东莞网站建设如何开通自己的网站
  • 中小企业品牌网站建设厦门网站的关键词自动排名
  • 网站备案主体更换软文吧
  • asp网站上一篇下一篇代码槐荫区网络营销seo