0079.单词搜索

方法一:回溯

时间复杂度 $O(mn \times 3^L)$,空间复杂度 $O(mn)$,其中 mn 表示网格的长度与宽度 L 为字符串 word 的长度。

func exist(board [][]byte, word string) bool {
	visited, m, n := make([][]bool, len(board)), len(board), len(board[0])
	for i := 0; i < m; i++ {
		visited[i] = make([]bool, n)
	}
	var dfs func(x, y, idx int) bool
	dfs = func(x, y, idx int) bool {
		if board[x][y] != word[idx] {
			return false
		}
		if idx == len(word)-1 {
			return true
		}

		// judege top bottom left right
		dirx, diry := []int{-1, 1, 0, 0}, []int{0, 0, -1, 1}
		for i := 0; i < 4; i++ {
			j, k := x+dirx[i], y+diry[i]
			if j >= 0 && j < m && k >= 0 && k < n && !visited[j][k] {
				visited[j][k] = true
				if dfs(j, k, idx+1) {
					return true
				}
				visited[j][k] = false
			}
		}
		return false
	}
	for i := 0; i < m; i++ {
		for j := 0; j < n; j++ {
			if board[i][j] == word[0] {
				visited[i][j] = true
				if dfs(i, j, 0) {
					return true
				}
				visited[i][j] = false
			}
		}
	}
	return false
}