[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