【每天学习一点算法 2026/03/20】单词搜索

每天学习一点算法 2026/03/20

题目:单词搜索

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

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

这道题有点像之前的岛屿数量,我们需要遍历网格中所有字符,找到符合单词开头的字母,然后寻找它上下左右的字符是否匹配单词的下一个字符,直到找到所有的字符或者碰到边界,如果遍历完网格中的所有字符还没找到就返回 false

typescript 复制代码
function exist(board: string[][], word: string): boolean {
  let res = false
  function helper (row: number, col: number, index: number) {
    if (board[row][col] === '#') return // 遇到已经使用过的选择无效
    // 遇到符合的字符
    if (board[row][col] === word[index]) {
     	// 如果已经匹配完成修改结果标识并返回
      if (index === word.length - 1) {
        res = true
        return
      }
      const temp = board[row][col] // 记录当前位置字符
      board[row][col] = '#' // 标记已经使用过的字符
      // 上
      if (row - 1 >= 0) {
        helper(row - 1, col, index + 1)
      }
      // 下
      if (row + 1 < board.length) {
        helper(row + 1, col, index + 1)
      }
      // 左
      if (col - 1 >= 0) {
        helper(row, col - 1, index + 1)
      }
      // 右
      if (col + 1 < board[0].length) {
        helper(row, col + 1, index + 1)
      }
      board[row][col] = temp // 周围没有匹配的下一个字符,此次选择无效,恢复此位置字符
    }
    return
  }
  
  // 循环遍历网格,传入初始字符
  for (let i = 0; i < board.length; i++) {
    for (let j = 0; j < board[0].length; j++) {
      helper(i, j, 0)
    }
  }
  return res
};

题目来源:力扣(LeetCode)

相关推荐
xian_wwq12 分钟前
【学习笔记】OWASP Agentic 应用安全(二)
笔记·学习·安全·owasp
(Charon)1 小时前
【C++】定时器进阶:使用最小堆管理定时任务
c++·算法
小弥儿1 小时前
GitHub今日热榜 | 2026-09-04:Agent省 token 成今日主线
学习·开源·github
hansang_IR1 小时前
【题解】 [省选联考 2021 A/B 卷] 卡牌游戏
c++·算法
前端精髓1 小时前
NestJS 是什么(对着 Spring Boot 一起学习)
spring boot·后端·学习
这个DBA有点耶2 小时前
COUNT慢不是因为用了*,是这5个原因——1000万行数据实测+执行计划深度解析
数据库·mysql·算法
贾伟康2 小时前
【口算王|01】HarmonyOS ArkTS 口算题生成实战:按年级、运算类型和难度生成可控题目
算法·harmonyos·arkts·随机生成·口算题
lzx_0022 小时前
C++11(一)
开发语言·c++·算法
529宝宝起名网2 小时前
用 Python 实现名字寓意评分算法:基于 NLP 语义分析的名字内涵深度评估
python·算法·自然语言处理
kyrie_sakura2 小时前
MySQL数据库学习笔记2--系统函数(分组,单行,窗口函数)
数据库·学习·mysql