当前位置: 首页 > 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/240172.html

相关文章:

  • 怎么修改网站标题关键词描述旺道seo推广
  • 网站备案找哪个部门抖音seo系统
  • 连云港东海网站建设加盟网络营销推广公司
  • wordpress自动tag排名优化公司哪家靠谱
  • 知名高端网站建设报价同城推广平台有哪些
  • 网站开发维护专员岗位职责电脑优化软件排行榜
  • 网站名词排名怎么做搜索
  • 网站设计软件培训怎么样关键词优化一年的收费标准
  • webview做网站app网址之家大全
  • 学校培训网站建设深圳全网推广公司
  • 余杭区建设局网站百度竞价排名查询网站
  • 无锡优化网站排名今日头条新闻最全新消息
  • 网站代码案例爱站网站长seo综合查询工具
  • 安阳网站开发网站注册流程和费用
  • 网站制作复杂吗推广团队
  • wordpress运行速度关键词优化的作用
  • 小型网站开发小论文产品设计公司
  • 农业信息中心网站建设厦门网站流量优化价格
  • 论坛网站地图怎么做近期国内新闻
  • 广州公司注册代理机构哪家好搜狗seo排名软件
  • 大连网站建设资讯自动优化句子的软件
  • 网站不同近期热点新闻事件
  • 上海平台网站开发宁波seo推广优化怎么做
  • 做权重网站免费友链互换
  • 做网站有地区差异吗公司网络推广排名定制
  • 商城型网站建设代理加盟seo推广外包
  • 网站建设考级百度开放平台登录
  • 怎样给一个公司做网站海外免费网站推广有哪些
  • 企业网站哪家好网络营销推广主要做什么?
  • 网站方案策划书seo服务外包费用