leetcode之79单词搜索Golang

题目描述

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false

算法

本题采用回溯法解决,深度遍历到最深处如果是正确结果,就直接返回,如果在这之间,遇到了错误,那么就直接往回退

本题算法

  • 定义一个二维数组[][]bool,他的初始值为false,他的元素数量和board的元素数量一样多,某些位置的值为true的时候,说明这个字符已经被用来匹配了,不能继续用来匹配
  • 首先遍历二维byte数组,找到与单词第一个字符匹配的地方,然后进入递归函数进行深度遍历
    • 首先判断这是不是已经判断完单词的最后一个字符,如果是就直接返回true
    • 判断在board中,该字符的上下左右是否存在字符,并且存在的字符是否已经被用来匹配并且这个字符是否匹配单词的下一个字符
      • 如果能够匹配就修改[][]byte的值,并且继续向深处匹配,直到单词的最后一位或者出现了错误,上下左右都走不通
      • 如果不能匹配就换个方向,当上下左右都不能匹配,那么就返回错误
  • 返回递归函数的结果,如果结果是true,就直接返回,如果结果是false,那么就重新找一个匹配单词开始字符的地方继续深度匹配
  • 当找完board都没有匹配成功,就返回false

代码

func exist(board [][]byte, word string) bool {
	if len(word) == 0 {
		return true
	}
	if len(board) == 0 || len(board[0]) == 0 {
		return false
	}
	boolBoard := make([][]bool, len(board))
	for i := 0; i < len(boolBoard); i++ {
		boolBoard[i] = make([]bool, len(board[0]))
	}
	var recursion func(row, column, index int) bool
	recursion = func(row, column, index int) bool {
		if index == len(word) {
			return true
		}
		// 分别找上下左右的点,并且这个点满足两个条件
		// 1是这个点的boardBool为false,2是这个点的board的值与单词中的字符相同
		top, down, left, right := false, false, false, false
		if row-1 >= 0 && !boolBoard[row-1][column] && board[row-1][column] == byte(word[index]) {
			boolBoard[row-1][column] = true
			top = recursion(row-1, column, index+1)
			boolBoard[row-1][column] = false
		}
		if top {
			return true
		}
		if row+1 < len(board) && !boolBoard[row+1][column] && board[row+1][column] == byte(word[index]) {
			boolBoard[row+1][column] = true
			down = recursion(row+1, column, index+1)
			boolBoard[row+1][column] = false
		}
		if down {
			return true
		}
		if column-1 >= 0 && !boolBoard[row][column-1] && board[row][column-1] == byte(word[index]) {
			boolBoard[row][column-1] = true
			left = recursion(row, column-1, index+1)
			boolBoard[row][column-1] = false
		}
		if left {
			return true
		}
		if column+1 < len(board[0]) && !boolBoard[row][column+1] && board[row][column+1] == byte(word[index]) {
			boolBoard[row][column+1] = true
			right = recursion(row, column+1, index+1)
			boolBoard[row][column+1] = false
		}
		if right {
			return true
		}
		return false
	}
	res := false
	for i := 0; i < len(board); i++ {
		for j := 0; j < len(board[0]); j++ {
			if board[i][j] == byte(word[0]) {
				boolBoard[i][j] = true
				res = recursion(i, j, 1)
				boolBoard[i][j] = false
				if res {
					return res
				}
			}
		}
	}
	return false
}
posted @ 2020-11-13 11:28  胖胖咩  阅读(125)  评论(0)    收藏  举报