1. 概述

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

示例:

board =

[

[‘A’,’B’,’C’,’E’],

[‘S’,’F’,’C’,’S’],

[‘A’,’D’,’E’,’E’]

]

给定 word = “ABCCED”, 返回 true

给定 word = “SEE”, 返回 true

给定 word = “ABCB”, 返回 false

2. 解题

  1. <?php
  2. // TODO
  3. class Solution {
  4. /**
  5. * @param String[][] $board
  6. * @param String $word
  7. * @return Boolean
  8. */
  9. public function exist($board, $word) {
  10. for ($i = 0; $i < count($board); $i++) {
  11. for ($j = 0; $j < count($board[0]); $j++) {
  12. $ret = $this->do($board, $i, $j, $word, 0);
  13. if ($ret) {
  14. return true;
  15. }
  16. }
  17. }
  18. return false;
  19. }
  20. /**
  21. * @param array $board 需要被搜索的数组
  22. * @param int $row 需要被搜索的行
  23. * @param int $col 需要被搜索的列
  24. * @param string $word 目标字符串
  25. * @param int $needCharKey 目标字符下表
  26. * @return bool
  27. */
  28. private function do(array &$board, int $row, int $col, string $word, int $needCharKey) {
  29. // 边界检查
  30. if (($row < 0) || ($col < 0) || ($row >= count($board)) || ($col >= count($board[0]))) {
  31. return false;
  32. }
  33. // 字符检查是否一致
  34. if ($board[$row][$col] != $word[$needCharKey]) {
  35. return false;
  36. }
  37. // 是否已经检查完目标字符串
  38. if ($needCharKey == strlen($word) - 1) {
  39. return true;
  40. }
  41. // 将搜索过数组元素改为 # , 等待回溯恢复
  42. $tmp = $board[$row][$col];
  43. $board[$row][$col] = '#';
  44. // 继续递归搜索:上,左,下,右
  45. $nextNextCharKey = $needCharKey + 1;
  46. if ($this->do($board, $row - 1, $col, $word, $nextNextCharKey)
  47. || $this->do($board, $row, $col - 1, $word, $nextNextCharKey)
  48. || $this->do($board, $row + 1, $col, $word, $nextNextCharKey)
  49. || $this->do($board, $row, $col + 1, $word, $nextNextCharKey)) {
  50. return true;
  51. }
  52. // 回溯需要将原来的字符改回
  53. $board[$col][$row] = $tmp;
  54. return false;
  55. }
  56. }
  57. $board = [
  58. ['A','B','C','E'],
  59. ['S','F','C','S'],
  60. ['A','D','E','E']
  61. ];
  62. // $word = "ABCCED";
  63. $word = "SEE";
  64. // $word = "ABCB";
  65. $cls = new Solution();
  66. $ret = $cls->exist($board, $word);
  67. var_dump($ret);