题目描述:给定一个二维网格和一个单词,找出该单词是否存在于网格中。

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

例子:

board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
] 给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.

解法:深度优先遍历 + 回溯

准备两个函数exist()__exist()

exist() 用于循环遍历网格,当前元素等于单词的第一个字母时,进入 __exist() 函数。代码实现如下:

// ac地址:https://leetcode-cn.com/problems/word-search/
// 原文地址:https://xxoo521.com/2020-02-17-word-search/ /**
* @param {character[][]} board
* @param {string} word
* @return {boolean}
*/
var exist = function(board, word) {
const rowNum = board.length;
const colNum = board[0].length; for (let i = 0; i < rowNum; ++i) {
for (let j = 0; j < colNum; ++j) {
if (board[i][j] === word[0]) {
const isExist = __exist(board, word, i, j, {});
if (isExist) return true; // 找到就返回
}
}
}
return false;
};

__exist() 函数是从指定位置开始,按照“上下左右”四个方向递归遍历,直到找到/找不到所有匹配的字母为止。代码实现如下:

/**
* @param {character[][]} board
* @param {string} word
* @param {number} row
* @param {number} col
* @param {object} visited
* @return {boolean}
*/
function __exist(board, word, row, col, visited) {
// 单词中字母全部匹配,说明可以搜索到,返回true
if (!word.length) {
return true;
} const key = `${row}-${col}`;
// 越界、之前访问过、单词首字母和当前元素不相同,返回false
if (
row >= board.length ||
row < 0 ||
col >= board[0].length ||
col < 0 ||
visited[key] ||
board[row][col] !== word[0]
) {
return false;
} visited[key] = true;
word = word.slice(1);
// 下、上、右、左搜索(顺序不重要)
const success =
__exist(board, word, row + 1, col, visited) ||
__exist(board, word, row - 1, col, visited) ||
__exist(board, word, row, col + 1, visited) ||
__exist(board, word, row, col - 1, visited); // success为false时,就是回溯
visited[key] = success;
return success;
}

代码中如果 success 为 false,说明以当前元素为出发点,搜索剩余字母失败。那么应该将visited[key]重置为 false,以方面其他路径使用。

例如对于以下数组,要搜索abbcbd。按照代码里的方向搜索逻辑,会先找到 abbd,然后发现查找失败,此时就要回溯。否则当按照正确方向找来时,visited 中的值是错误的。

a b b
d b c

更多资料

  • LeetCode 79.单词搜索 - JavaScript的更多相关文章

    1. Java实现 LeetCode 79 单词搜索

      79. 单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格. ...

    2. Leetcode 79.单词搜索

      单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单 ...

    3. LeetCode——79. 单词搜索

      给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字 ...

    4. [LeetCode] 79. 单词搜索(DFS,回溯)

      题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...

    5. LeetCode 79. 单词搜索(Word Search)

      题目描述 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被 ...

    6. Leetcode之回溯法专题-79. 单词搜索(Word Search)

      Leetcode之回溯法专题-79. 单词搜索(Word Search) 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元 ...

    7. [LeetCode题解]79. 单词搜索

      题目描述 题目:79. 单词搜索 解题思路 遍历 首先找重复性,题目说给定单词是否存在于二维数组中,可以简化为从 (x, y) 走 n 步(n 表示单词长度),查看给定单词是否存在.然后再遍历二维数组 ...

    8. [leetcode] 212. 单词搜索 II(Java)

      212. 单词搜索 II 这leetcode的评判机绝对有问题!!同样的代码提交,有时却超时!害得我至少浪费两个小时来寻找更优的答案= =,其实第一次写完的代码就可以过了,靠!!!第207位做出来的 ...

    9. Leetcode 212.单词搜索II

      单词搜索II 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻&q ...

    随机推荐

    1. Object的rest和spread方法

      //将多个对象合并到一个对象里 const input = { a: 1, b: 2 } const test = { d: 5 } const output = { ...input, ...tes ...

    2. 对C#单例模式的理解

      2018年11月6日       小雨 一.单例模式的定义 确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一的实例,是一种对象创建型模式,有如下3个要点: 只能有一个实例 必须是自行创建这个 ...

    3. webpack 打包增加版本信息

      What do we need? 笔者目的是在vue项目打包后的 dist/index.html 文件中写入本次打包git用户.最后一次git提交信息,这样做的目的是便于线上项目的管理和防止同事之间的 ...

    4. Googletest Primer

      Googletest Primer 原文地址:https://github.com/google/googletest/blob/master/googletest/docs/primer.md In ...

    5. 思科ACS的性能总结

      ACS Performance & Scale 思科ACS目前还能支持的可能就是ACS5.8版本了,该版本也将于2020年停止支持,关于ACS信息会逐步退出大家的视野.该文档是Cisco论坛t ...

    6. 避免重复数据查询DISTINCT

      [1]避免重复——DISTINCT SELECT  DISTINCT  job  FROM   t_enployee; #去除job字段的重复项,只显示所有job字段中的非重复项,比如job里有:te ...

    7. 搭建vue工程遇到的问题汇总

      1.vue搭建环境- vue init webpack my-project无响应(如下报错) 原因:node 版本过高.v8.1.0 解决拌饭: 降级,终端指令 n v8.0.0; mac用户: s ...

    8. tomcat安装成功以后进行测试步骤:

      tomcat安装成功以后进行测试步骤: 编写测试页面: 进入Tomcat安装对应路径: E:\Tomcat\apache-tomcat-8.5.45\webapps\ROOT 创建:test.jsp ...

    9. Python整合pdf【新手必学】

      在下载课件时往往会分成很多个小的pdf,一个也就几页,想要整合成一整个大pdf,于是百度了一下,网上有很多在线的pdf整合器,但是由于这蛋疼的网速,流量还要花钱,还是想要本地搞. 说python是万能 ...

    10. Django框架之ORM的相关操作之一对一关系(四)

      ORM中一对一在当一张表的某一些字段查询的比较频繁,另外一些字段查询的不是特别频繁,那么就把不常用的字段单独拿出来做成一张表,然后通过一对一进行关联起来.举个例子:在我们登录某个账户的时候,一般会显示 ...