2021-10-02:单词搜索。给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。力扣79。

福大大 答案2021-10-02:

自然智慧即可。 递归。对于board[i][j],上下左右走。1.制造现场;2.递归;3.恢复现场。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
    board := [][]byte{{'A', 'B', 'C', 'E'}, {'S', 'F', 'C', 'S'}, {'A', 'D', 'E', 'E'}}
    word := "ABCCED"
    ret := exist(board, word)
    fmt.Println(ret)
}

func exist(board [][]byte, word string) bool {
    w := []byte(word)
    for i := 0; i < len(board); i++ {
        for j := 0; j < len(board[0]); j++ {
            if f(board, i, j, w, 0) {
                return true
            }
        }
    }
    return false
}

// 目前到达了b[i][j],word[k....]
// 从b[i][j]出发,能不能搞定word[k....] true false
func f(b [][]byte, i int, j int, w []byte, k int) bool {
    if k == len(w) {
        return true
    }
    // word[k.....] 有字符
    // 如果(i,j)越界,返回false
    if i < 0 || i == len(b) || j < 0 || j == len(b[0]) {
        return false
    }
    if b[i][j] != w[k] {
        return false
    }
    tmp := b[i][j]
    b[i][j] = 0
    ans := f(b, i-1, j, w, k+1) || f(b, i+1, j, w, k+1) || f(b, i, j-1, w, k+1) || f(b, i, j+1, w, k+1)
    b[i][j] = tmp
    return ans
}

执行结果如下: 图片


左神java代码