[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

浙公网安备 33010602011771号