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

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

例子:

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. Dataset数据的XML持久化处理

      主要方法是用ADO.NET的DataTale 填充到Dataset Dataset 内置了XML持久化的方法,WriteXML和ReadXML:简单的WinFrom实例:从数据库的表 private ...

    2. 将 master 节点服务器从 k8s 集群中移除并重新加入

      背景 1 台 master 加入集群后发现忘了修改主机名,而在 k8s 集群中修改节点主机名非常麻烦,不如将 master 退出集群改名并重新加入集群(前提是用的是高可用集群). 操作步骤 ssh 登 ...

    3. Lindström–Gessel–Viennot lemma定理 行列式板子

      https://blog.csdn.net/qq_37025443/article/details/86537261 博客 下面是wiki上的讲解,建议耐心地看一遍...虽然看了可能还是不懂 http ...

    4. drf解析模块,异常模块,响应模块,序列化模块

      复习 """ 1.接口:url+请求参数+响应参数 Postman发送接口请求的工具 method: GET url: https://api.map.baidu.com ...

    5. 【音乐欣赏】《Happy Together (The Turtles Cover)》 - Unlike Pluto / Why Mona

      曲名:Happy Together 作者:Unlike Pluto.Why Mona [00:11.746] Imagine me and you, I do [00:14.478] I think ...

    6. Go时间

      package main import ( "time" "fmt" "math/rand" ) func main() { /* time ...

    7. Python实验案例

      Python 运算符.内置函数 实验目的: 1.熟练运用 Python 运算符. 2.熟练运用 Python 内置函数.实验内容: 1.编写程序,输入任意大的自然数,输出各位数字之和. 2.编写程序, ...

    8. GitBook的账号注册和安装使用(一)

      1.GitBook账号注册 GitBook原注册地址  https://legacy.gitbook.com/join 改为: https://www.gitbook.com/ (1)注册账号:htt ...

    9. 2016 Google code jam 大赛

      二,RoundC import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundE ...

    10. tp5 rewrite apache 配置

      emmmmm,本来还是nginx服务器,突然换成了apache ubuntu系统,apache2服务器,tp5, 1.首先还是运行phpinfo.php,搜一下“Loaded Modules”这里面是 ...