[Leetcode]15.矩阵中的路径(深度优先搜索 回溯)

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出)。

 

 

示例 1:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true

示例 2:

输入:board = [["a","b"],["c","d"]], word = "abcd"
输出:false

 

 

思想:DFS,首先寻找数组中所有符合目标字符串开头的字母,分别开始递归寻找,记录当前查找的数组,坐标,目标字符串中对应字母的序号以及目标字符串。

进入Search函数进行查找:如果k==目标字符串长度,那么证明最后一个字母也被查找到了(最后一个字母结束后也会进入k+1的递归,所以条件是k==字符串的长度),其次进行判断,当前查找的坐标是否越界,如果越界直接结束。如果不越界,那么判断当前的坐标字母是否为待查找的字母,如果是,暂时将其替换为不会重复的字符空格(防止重复使用),递归查找4个方向的坐标是否为下一个字母,如果找到返回true,没找到则将当前字母还原以便回溯后再使用。

func exist(board [][]byte, word string) bool {
    var l = len(board)
    var h = len(board[0])
    for i:=0;i<l;i++{
        for j:=0;j<h;j++{
            if search(board,i,j,0,word){
                return true
            }
        }
    }
    return false
}

func search(board [][]byte,i,j,k int,word string) bool{
    if(k==len(word)){
        return true
    }
    if(i<0||j<0||i>=len(board)||j>=len(board[0])){
        return false
    }
    if board[i][j]==word[k]{
        temp := board[i][j]
        board[i][j] = ' '
        if search(board,i,j+1,k+1,word)||search(board,i+1,j,k+1,word)||search(board,i,j-1,k+1,word)||search(board,i-1,j,k+1,word){
            return true
        }else{
            board[i][j] = temp
        }
    }
    return false
}

 

题目来源:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof

posted @ 2021-10-26 10:29  梦想是能睡八小时的猪  阅读(49)  评论(0)    收藏  举报