每天学习一点算法 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)