61 lines
1.2 KiB
Go
61 lines
1.2 KiB
Go
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
|