package q79 func search(board [][]byte, word string, prefixLen, row, col int) bool { if row < 0 || col < 0 || row >= len(board) || col >= len(board[0]) { return false } if word[prefixLen] != board[row][col] { return false } if prefixLen+1 == len(word) { return true } c := board[row][col] board[row][col] = '#' yes := false || search(board, word, prefixLen+1, row, col+1) || search(board, word, prefixLen+1, row, col-1) || search(board, word, prefixLen+1, row+1, col) || search(board, word, prefixLen+1, row-1, col) board[row][col] = c return yes } func exist(board [][]byte, word string) bool { w, h := len(board[0]), len(board) if len(word) > w*h { return false } charFreq := make([]int, 26*2) idx := func(b byte) byte { if b >= 'a' { return b - 'a' + 26 } return b - 'A' } for row := range board { for col := range board[0] { charFreq[idx(board[row][col])]++ } } for i := range len(word) { ii := idx(word[i]) charFreq[ii]-- if charFreq[ii] < 0 { return false } } for row := range board { for col := range board[0] { if search(board, word, 0, row, col) { return true } } } return false } var _ = exist