79. 单词搜索回溯Normal

Posted pre_eminent

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了79. 单词搜索回溯Normal相关的知识,希望对你有一定的参考价值。

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 仅由大小写英文字母组成

进阶:你可以使用搜索剪枝的技术来优化解决方案,使其在 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的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 每日一题 79. 单词搜索

leetcode 79. Word Search 单词搜索

leetcode 79 单词搜索

leetcode中等79单词搜索

[JavaScript 刷题] 搜索 - 单词搜索, leetcode 79

[JavaScript 刷题] 搜索 - 单词搜索, leetcode 79