【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;
}
};