请设计一个函数,用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如
矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
数据范围:
,
[[a,b,c,e],[s,f,c,s],[a,d,e,e]],"abcced"
true
[[a,b,c,e],[s,f,c,s],[a,d,e,e]],"abcb"
false
0 <= matrix.length <= 2000 <= matrix[i].length <= 200
package main
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param matrix char字符型二维数组
* @param word string字符串
* @return bool布尔型
*/
func hasPath( matrix [][]byte , word string ) bool {
n,m:=len(matrix),len(matrix[0])
vis:=make([][]bool,n)
for i,_:=range vis{
vis[i]=make([]bool,m)
}
dirs:=[][]int{[]int{0,1},[]int{1,0},[]int{0,-1},[]int{-1,0}}
var ans bool
var dfs func(int,int,string)
dfs=func(i,j int,word string){
if ans||vis[i][j]||matrix[i][j]!=word[0]{
return
}
vis[i][j]=true
word=word[1:]
if len(word)==0{
ans=true
return
}
for _,dir:=range dirs{
x,y:=i+dir[0],j+dir[1]
if x>=0&&x<n&&y>=0&&y<m{
dfs(x,y,word)
}
}
vis[i][j]=false
}
for i:=0;i<n;i++{
for j:=0;j<m;j++{
if matrix[i][j]==word[0]{
dfs(i,j,word)
}
}
}
return ans
} package main
import "fmt"
func main() {
matrix := [][]byte{
{
'a', 'b', 'c', 'e',
},
{
's', 'f', 'c', 's',
},
{
'a', 'd', 'e', 'e',
},
}
word := "see"
result := hasPath(matrix, word)
fmt.Println(result)
}
func hasPath(matrix [][]byte, word string) bool {
record := make([][]int, len(matrix))
for x := 0; x < len(matrix); x++ {
record[x] = make([]int, len(matrix[0]))
}
// write code here
for i := 0; i < len(matrix); i++ {
for j := 0; j < len(matrix[i]); j++ {
if matrix[i][j] == word[0] {
record[i][j] = 1
result := false
dfs(matrix, i, j, 1, word, record, &result)
record[i][j] = 0
if result {
return result
}
}
}
}
return false
}
func dfs(matrix [][]byte, i, j, k int, word string, record [][]int, result *bool) {
direction := [][]int{{1, 0}, {-1, 0}, {0, -1}, {0, 1}} // 方向 上下左右
if k == len(word) { // 成功
*result = true
}
if *result == true || k >= len(word) { // 终止
return
}
for d := 0; d < 4; d++ { // 遍历四个方向
idn, jdn := i+direction[d][0], j+direction[d][1]
if idn < 0 || idn >= len(matrix) || jdn < 0 || jdn >= len(matrix[i]) || matrix[idn][jdn] != word[k] || record[idn][jdn] == 1 {
continue
}
record[idn][jdn] = 1
dfs(matrix, idn, jdn, k+1, word, record, result) // 递归
record[idn][jdn] = 0 // 回溯
}
}