79. 单词搜索

128 阅读1分钟

题目:
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/wo… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法:

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

func search(board [][]byte, word string, index int, visited [][]bool, m, n, i, j int) bool {
    if index == len(word) {
        return true
    }    
    if 0 <= i && i < m && 0 <= j && j < n && !visited[i][j]{
        if board[i][j] == word[index] {
            visited[i][j] = true
            r1 := search(board, word, index + 1, visited, m, n, i + 1, j)
            r2 := search(board, word, index + 1, visited, m, n, i - 1, j)
            r3 := search(board, word, index + 1, visited, m, n, i, j + 1)
            r4 := search(board, word, index + 1, visited, m, n, i, j - 1) 
            visited[i][j] = false
            return r1 || r2 || r3 || r4
        } 
    }
    return false
}