Go语言实现:【剑指offer】矩阵中的路径

该题目来源于牛客网《剑指offer》专题。

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

Go语言实现:

func hasPath(matrix []rune, rows, cols int, str []rune) bool {
	lengthM := len(matrix)
	lengthS := len(str)
	if lengthM == 0 || lengthS == 0 || rows <= 0 || cols <= 0 || lengthM != rows*cols {
		return false
	}
	//标记是否走过
	//此处用数组无法指定长度,用切片操作下标越界,所以用map
	flag := make(map[int]int)
	//循环匹配字符
	for i := 0; i < rows; i++ {
		for j := 0; j < cols; j++ {
			//找到str路径,返回true
			if hasPathHandler(matrix, rows, cols, i, j, str, 0, flag) {
				return true
			}
		}
	}
	return false
}

func hasPathHandler(matrix []rune, rows, cols, i, j int, str []rune, k int, flag map[int]int) bool {
	index := i*cols + j
	//i越界
	//j越界
	//矩阵元素不等于str字符
	//矩阵元素已经走过了
	if i < 0 || i >= rows || j < 0 || j >= cols || matrix[index] != str[k] || flag[index] == 1 {
		return false
	}
	//匹配结束
	if k == len(str)-1 {
		return true
	}
	//元素匹配上,falg变为1
	flag[index] = 1
	//下一位匹配上下左右,返回bool,所以是或
	if hasPathHandler(matrix, rows, cols, i-1, j, str, k+1, flag) ||
		hasPathHandler(matrix, rows, cols, i+1, j, str, k+1, flag) ||
		hasPathHandler(matrix, rows, cols, i, j-1, str, k+1, flag) ||
		hasPathHandler(matrix, rows, cols, i, j+1, str, k+1, flag) {
		return true
	}
	//没匹配上,当前位flag变为0,因为从下一个元素开始时,当前位有可能会成为下一位
	flag[index] = 0
	return false
}
posted @ 2019-12-03 16:38  南方有嘉木1993  阅读(231)  评论(0编辑  收藏  举报