leetcode79. 单词搜索 网格地图搜索+回溯经典写法啦

举报
兔老大 发表于 2021/04/23 00:07:47 2021/04/23
【摘要】 给定一个二维网格和一个单词,找出该单词是否存在于网格中。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。 示例: board = [   ['A','B','C','E'],   ['S','F','C','S'],   ['A','D','E'...

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.

思路:搜索回溯基本上是经典模板题了。


  
  1. class Solution {
  2. private boolean[][] marked;
  3. // x-1,y
  4. // x,y-1 x,y x,y+1
  5. // x+1,y
  6. private int[][] direction = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}};
  7. // 盘面上有多少行
  8. private int m;
  9. // 盘面上有多少列
  10. private int n;
  11. private String word;
  12. private char[][] board;
  13. public boolean exist(char[][] board, String word) {
  14. m = board.length;
  15. if (m == 0)return false;
  16. n = board[0].length;
  17. marked = new boolean[m][n];
  18. this.word = word;
  19. this.board = board;
  20. for (int i = 0; i < m; i++)
  21. for (int j = 0; j < n; j++)
  22. if (dfs(i, j, 0))
  23. return true;
  24. return false;
  25. }
  26. private boolean dfs(int i, int j, int start) {
  27. if (start == word.length() - 1) {
  28. return board[i][j] == word.charAt(start);
  29. }
  30. if (board[i][j] == word.charAt(start)) {
  31. marked[i][j] = true;
  32. for (int k = 0; k < 4; k++) {
  33. int newX = i + direction[k][0];
  34. int newY = j + direction[k][1];
  35. if (newX >= 0 && newX < m && newY >= 0 && newY < n && !marked[newX][newY]) {
  36. if (dfs(newX, newY, start + 1)) {
  37. return true;
  38. }
  39. }
  40. }
  41. marked[i][j] = false;
  42. }
  43. return false;
  44. }
  45. }

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/104429737

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。