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

【LeetCode刷题记录】79. 单词搜索(JS解法)

79. 单词搜索

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例 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

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

思路:

使用回溯法。首先需要确定起始位置,可能不止存在一个可能的起始位置,由于不能重复使用一个单元格内的字母,所以需要使用标记数组标记是否已使用:

// 使用 Array.from() 方法创建二维数组
// rows*cols 行*列
const twoDArray = Array.from({ length: rows }, () => Array(cols).fill(0));

再找到起始位置后,需要遍历其相邻位置字母看是否匹配,然后递归,取消标记回溯。当遍历的长度达到word单词长度时表示遍历结束。

代码:

/**
 * @param {character[][]} board
 * @param {string} word
 * @return {boolean}
 */
var exist = function (board, word) {
    const m = board[0].length; // 列数
    const n = board.length;  // 行数
    // n*m二维数组
    const used = Array.from({ length: n }, () => Array(m).fill(false));
    // 相邻元素位置
    const x = [-1, 1, 0, 0];
    const y = [0, 0, -1, 1];

    // 记录与word首字母相同字母的起始位置
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < m; j++) {
            if (board[i][j] === word[0]) {
                used[i][j] = true;
                if (backtracking(1, i, j)) {
                    return true;
                }
                used[i][j] = false;
            }
        }
    }
    return false;
    
    function backtracking(index, posX, posY) {
        if (index === word.length) {
            return true;
        }
        for (let i = 0; i < 4; i++) {
            const newX = posX + x[i];
            const newY = posY + y[i];
            if (newX >= 0 && newX < n && newY >= 0 && newY < m) {
                if (board[newX][newY] === word[index] && used[newX][newY] === false) {
                    used[newX][newY] = true;
                    if (backtracking(index + 1, newX, newY)) {
                        return true;
                    }
                    used[newX][newY] = false;
                }
            }
        }
        return false;
    }
};

http://www.kler.cn/a/563696.html

相关文章:

  • 《机器学习数学基础》补充资料:从几何角度理解矩阵
  • Orcale、MySQL中左连接,右连接,内连接的区别以及运用场景系列04(运用场景、左右表关系)
  • 详解 c++ 中的 namespage
  • 算法-图-查找路径
  • 道可云人工智能每日资讯|深圳将设立人工智能和机器人产业基金
  • 【Android】ViewPager的使用
  • Xcode如何高效的一键重命名某个关键字
  • 2025年SCI一区智能优化算法:真菌生长优化算法(Fungal Growth Optimizer,FGO),提供MATLAB代码
  • SQL获取数据库中包含某个字段的表
  • Java注解的原理
  • Deepseek开源周,第二天:Deep EP
  • C++ gtest框架
  • 【react】TypeScript在react中的使用
  • kafka的ACL配置的sasl.kerberos.principal.to.local.rules配置解释
  • 简单易懂,解析Go语言中的struct结构体
  • Spring 源码硬核解析系列专题(五):Spring Boot 自动装配的原理
  • Fiddler在Windows下抓包Https
  • 支持自动化数据回放
  • spirng相关面试题
  • 云原生(五十七) | 阿里云CDN基本概念