(典型dfs,知道思想写错)

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

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

示例:

  1. board =
  2. [
  3. ['A','B','C','E'],
  4. ['S','F','C','S'],
  5. ['A','D','E','E']
  6. ]
  7.  
  8. 给定 word = "ABCCED", 返回 true.
  9. 给定 word = "SEE", 返回 true.
  10. 给定 word = "ABCB", 返回 false.
  1. public class Solution {
  2.     public boolean exist(char[][] board, String word) {
  3.         int m = board.length;
  4.         int n = board[0].length;
  5.         boolean[][] visited = new boolean[m][n];
  6.         for(int i = 0; i < m; i++){
  7.             for(int j = 0; j < n; j++){
  8.                 if(dfs(board, word, visited, i, j, m, n, 0))
  9.                    return true;
  10.             }
  11.         }
  12.         return false;
  13.     }
  14.      
  15.     private boolean dfs(char[][] board, String word, boolean[][] visited, int i, int j, int m, int n, int count){
  16.         if(count == word.length()){
  17.             return true;
  18.         }
  19.         if(i < 0 || i >= m || j < 0 || j >= n || board[i][j] != word.charAt(count))
  20.             return false;
  21.         if(visited[i][j])
  22.             return false;
  23.         visited[i][j] = true;
  24.         boolean res = dfs(board, word, visited, i - 1, j, m, n, count + 1) ||
  25.             dfs(board, word, visited, i + 1, j, m, n, count + 1) ||
  26.             dfs(board, word, visited, i, j - 1, m, n, count + 1)||
  27.             dfs(board, word, visited, i, j + 1, m, n, count + 1);
  28.         visited[i][j] = false;
  29.         return res;
  30.     }
  31. }
 参考2:
  1. class Solution {
  2. public boolean exist(char[][] board, String word) {
  3. // 标志位,初始为false
  4. int row = board.length, col = board[0].length;
  5. boolean[][] flag = new boolean[row][col];
  6. for(int r = 0; r < row; r++){
  7. for(int c = 0; c < col; c++){
  8. if(isSolution(board,r,c,flag,word,0))
  9. return true;
  10. }
  11. }
  12. return false;
  13. }
  14. public boolean isSolution(char[][] board,int r, int c, boolean[][] flag, String word, int start){
  15. // 递归出口
  16. if(r<0||r>=board.length||c<0||c>=board[0].length||board[r][c]!=word.charAt(start)||flag[r][c]==true)
  17. return false;
  18. // 匹配成功
  19. if(start==word.length()-1)
  20. return true;
  21. // 标记已走过的位置
  22. flag[r][c] = true;
  23. // 上下左右递归查找
  24. if(isSolution(board,r-1,c,flag,word,start+1)
  25. ||isSolution(board,r+1,c,flag,word,start+1)
  26. ||isSolution(board,r,c-1,flag,word,start+1)
  27. ||isSolution(board,r,c+1,flag,word,start+1)){
  28. return true;
  29. }
  30. // 没匹配到则把标记为改回去!!!
  31. flag[r][c] = false;
  32. return false;
  33. }
  34. }

【1】【leetcode-79】 单词搜索的更多相关文章

  1. Java实现 LeetCode 79 单词搜索

    79. 单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格. ...

  2. Leetcode 79.单词搜索

    单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单 ...

  3. LeetCode 79.单词搜索 - JavaScript

    题目描述:给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单 ...

  4. LeetCode——79. 单词搜索

    给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字 ...

  5. [LeetCode] 79. 单词搜索(DFS,回溯)

    题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...

  6. LeetCode 79. 单词搜索(Word Search)

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

  7. Leetcode之回溯法专题-79. 单词搜索(Word Search)

    Leetcode之回溯法专题-79. 单词搜索(Word Search) 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元 ...

  8. [LeetCode题解]79. 单词搜索

    题目描述 题目:79. 单词搜索 解题思路 遍历 首先找重复性,题目说给定单词是否存在于二维数组中,可以简化为从 (x, y) 走 n 步(n 表示单词长度),查看给定单词是否存在.然后再遍历二维数组 ...

  9. [leetcode] 212. 单词搜索 II(Java)

    212. 单词搜索 II 这leetcode的评判机绝对有问题!!同样的代码提交,有时却超时!害得我至少浪费两个小时来寻找更优的答案= =,其实第一次写完的代码就可以过了,靠!!!第207位做出来的 ...

  10. Leetcode 212.单词搜索II

    单词搜索II 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻&q ...

随机推荐

  1. 手机Web 开发中图片img 如何等比例缩放

    如果图片本身没有设置 width.height属性的话,只需要修改 max-width:100%; 就可以了 如果图片本身设置了 width.height属性的话,需要同时修改width 和heigh ...

  2. 七牛云 qshell 使用

    七牛云 qshell 控制台工具上传 命令:qshell fput another1 demo.txt /users/tianyang/demo.txt ======================= ...

  3. ecplise An incompatible version [1.2.14] of the APR based Apache Tomcat Native library is installed, while T

    原文:https://www.cnblogs.com/levy-home/p/5676322.html 到http://archive.apache.org/dist/tomcat/tomcat-co ...

  4. MT【243】球内接四面体体积

    已知半径为2的球面上有$A,B,C,D$四点,若$AB=CD=2$,则四面体$ABCD$的体积最大为____ 解答:利用$V=\dfrac{1}{6}|AB||CD|d<AB,CD>sin ...

  5. nfs的配置文件/etc/exports

    /etc/exports  文件格式 <输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)] a. 输出目录:输出目录是指NFS系统中 ...

  6. linux下对clamav杀毒软件的安装和配置

    下载安装 首先安装zlib库: # yum install zlib zlib-devel //安装可忽略 下载安装clamav源码包 clamav管网:http://www.clamav.net/d ...

  7. android sqlite boolean 类型

    sql语句中 boolean (bit)类型的字段 ,insert 数据的时候 , 有null ,0 (false),1(true) 三个数可以选择. 例如: insert into pos valu ...

  8. poj 2356 (抽屉原理)

    题目链接:http://poj.org/problem?id=2356 题目大意:给你n个数,要你从n个数选出若干个数,要求这若干个数的和是n的倍数,输出选择数的个数,以及相应的数. 解题思路: 以下 ...

  9. InnoDB,5项最佳实践,知其所以然?

    InnoDB,5项最佳实践,知其所以然? 原创: 58沈剑 架构师之路 昨天 缓存讲了一个月<缓存架构,一篇足够>.今天,开始写数据库. 第一篇,说说MySQL两个最常用的存储引擎,MyI ...

  10. react-native中的state

    我们使用两种数据来控制一个组件:props和state.props是在父组件中指定, 而且一经指定,在被指定的组件的生命周期中则不再改变. 对于需要改变的数据,我们需要使用state. 假如我们需要制 ...