Leetcode 79. 单词搜索

68 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

1.题目

给定一个 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.思路

本题需要我们找到word是否存在于网格之中,我们通过回溯的方式来寻找每个字母的上下左右方向,如果找到了就标记为false避免后续再寻找回来陷入死循环。然后通过递归的方式,来进行深入调用判断直到找到正确的字符串或者确定没有正确的字符串返回结果。

首先我们需要遍历整个board找到字符串的首字母,找到首字母后开始对首字母周围的字母进行遍历,找到是否满足字符串的第二个字母,然后再对第二个字母周围的字母进行遍历找到满足字符串第三个字母,通过这样递归和遍历的方式来寻找满足条件的结果,在这中间我们还需要处理边界值的影响以及标记已经使用过的字母。在进入一个新字母的时候将其标记为使用过,在判断无法继续进行的时候将其还原成未使用。

var exist = function (board, word) {
  board[-1] = []; 
  board.push([])
  
  let dfs = function(word,board,y, x, i){
    if (i + 1 === word.length) return true
    var tmp = board[y][x];
    board[y][x] = false
    if (board[y][x + 1] === word[i + 1] && dfs(word,board,y, x + 1, i + 1)) return true
    if (board[y][x - 1] === word[i + 1] && dfs(word,board,y, x - 1, i + 1)) return true
    if (board[y + 1][x] === word[i + 1] && dfs(word,board,y + 1, x, i + 1)) return true
    if (board[y - 1][x] === word[i + 1] && dfs(word,board,y - 1, x, i + 1)) return true
    board[y][x] = tmp
  }

  for (let i = 0; i < board.length; i++) {
    for (let j = 0; j < board[0].length; j++) {
      if (word[0] === board[j][i] && dfs(word,board,j, i, 0)) return true
    }
  }
  return false
};