给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
- 先从头遍历矩阵,找到第一个符合的字符,开始深度优先遍历
- 深度优先遍历:
- 定义index代表索引,或者说已经匹配了多少个字符
- 要写递归的出口:i、j越界或者字符不匹配
- 匹配成功:index等于word.length - 1,匹配成功,直接返回true
- 为了同一个单元格内的字母不允许被重复使用,遍历到某字符后,将当前字符设置为'',防止四个方向dfs再次遍历到
- 四个方向遍历完毕后,再恢复这个字符
- 最后若一直匹配失败,返回false
var exist = function (arr, str) {
if (!arr) return false
var m = arr.length;
var n = arr[0].length;
for (var i = 0; i < m; i++) {
for (var j = 0; j < n; j++) {
if (dfs(i, j, 0)) return true
}
}
function dfs(i, j, x) {
if (i < 0 || j < 0 || i >= m || j >= n || arr[i][j] != str[x]) return false
if (x == str.length - 1) return true
var mid = arr[i][j]
arr[i][j] = ""
var res = dfs(i + 1, j, x + 1) || dfs(i, j + 1, x + 1) || dfs(i - 1, j, x + 1) || dfs(i, j - 1, x + 1)
arr[i][j] = mid
return res
}
return false
};