79. 单词搜索回溯Normal
Posted pre_eminent
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了79. 单词搜索回溯Normal相关的知识,希望对你有一定的参考价值。
难度中等
给定一个 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
仅由大小写英文字母组成
进阶:你可以使用搜索剪枝的技术来优化解决方案,使其在 board
更大的情况下可以更快解决问题?
思路:
1. 双重循环遍历棋盘,对每一个格子执行回溯函数
2.第1点可以优化,只在首字母匹配时,才开始执行回溯函数
3. 回溯函数的参数之一:matched 如果 等于word长度时,返回true表示全部匹配完成
4. 回溯函数中,如果越界,直接return false;
5. 回溯函数中,如果word[matched] !== board[i][j],直接return false;
6. 如果word[matched] === board[i][j],表示匹配上一个字符了,
匹配数+1,同时往四个方向进行扩散
7. 进入下一层之前,将board[i][j]抹掉;
回溯返回后,要将抹掉的值还原;
因为题目要求已匹配的字符不能重复使用
解答:
/**
* @param character[][] board
* @param string word
* @return boolean
*/
var exist = function(board, word)
// 遍历棋盘上的每一个位置
for (let i = 0; i < board.length; i++)
for (let j = 0; j < board[0].length; j++)
if (board[i][j] === word.charAt(0))
// 小小优化:首字母匹配时,才开始执行回溯函数
if (backtrack(board, i, j, word, 0))
return true;
return false;
;
function backtrack(board, i, j, word, matched)
// 如果已匹配的数目 和 word一样长时,返回真
if (matched === word.length)
return true;
// 如果越界
if (i < 0 || j < 0 || i >= board.length || j >= board[0].length)
return false;
// 如果字母不匹配,也没有必要去遍历它的4个方向了
if (board[i][j] !== word.charAt(matched))
return false;
// 如果相同,则往四个方向进行匹配
// 做出选择
let tmp = board[i][j];
board[i][j] = '#';
// 进入下一层
let b = backtrack(board, i + 1, j, word, matched + 1) || backtrack(board, i - 1, j, word, matched + 1) || backtrack(board, i, j + 1, word, matched + 1) || backtrack(board, i, j - 1, word, matched + 1);
// 撤销选择
board[i][j] = tmp;
return b;
以上是关于79. 单词搜索回溯Normal的主要内容,如果未能解决你的问题,请参考以下文章