📑 题目:79. 单词搜索

🚀 本题 LeetCode 传送门

题目大意

给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

解题思路

  • 在地图上的任意一个起点开始,向 4 个方向分别 DFS 搜索,直到所有的单词字母都找到了就输出 true,否则输出 false。

代码

  1. package leetcode
  2. var dir = [][]int{
  3. []int{-1, 0},
  4. []int{0, 1},
  5. []int{1, 0},
  6. []int{0, -1},
  7. }
  8. func exist(board [][]byte, word string) bool {
  9. visited := make([][]bool, len(board))
  10. for i := 0; i < len(visited); i++ {
  11. visited[i] = make([]bool, len(board[0]))
  12. }
  13. for i, v := range board {
  14. for j := range v {
  15. if searchWord(board, visited, word, 0, i, j) {
  16. return true
  17. }
  18. }
  19. }
  20. return false
  21. }
  22. func isInBoard(board [][]byte, x, y int) bool {
  23. return x >= 0 && x < len(board) && y >= 0 && y < len(board[0])
  24. }
  25. func searchWord(board [][]byte, visited [][]bool, word string, index, x, y int) bool {
  26. if index == len(word)-1 {
  27. return board[x][y] == word[index]
  28. }
  29. if board[x][y] == word[index] {
  30. visited[x][y] = true
  31. for i := 0; i < 4; i++ {
  32. nx := x + dir[i][0]
  33. ny := y + dir[i][1]
  34. if isInBoard(board, nx, ny) && !visited[nx][ny] && searchWord(board, visited, word, index+1, nx, ny) {
  35. return true
  36. }
  37. }
  38. visited[x][y] = false
  39. }
  40. return false
  41. }