文章目录

  • 单词搜索
    • DFS :
    • 小小的优化
  • 总结

单词搜索

题目链接:https://leetcode-cn.com/problems/word-search/

题目描述:
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

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

DFS :

算法1:对每一个可能的点采用DFS遍历,判断是否可以得到唯一解,若存在即返回true,否则为 false。其中在递归过程中,flag 数组的值需要在递归之前置为 true,递归之后置为 flase,即它的状态需要回退。参考代码如下(带注释):

 int[] addi={1,-1,0,0};int[] addj={0,0,1,-1};boolean[][] flag;public boolean exist(char[][] board, String word) {int m=board.length,n=board[0].length;flag=new boolean[m][n];//flag数组用来标记某个字符是否被访问过for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(board[i][j]==word.charAt(0)){//对每一个首字符都需要进行DFS遍历,判断是否在此处可以搜索到到完整的字符串if(solve(board,i,j,word,1))return true;}}}return false;}/*想一想,在每次调用 slove 方法时,flag 数组的所有值应该都为 false 吧,即上一次 solve 方法对 flag 造成的影响和下一次 solve 方法调用 flag 无关, flag 的功能仅是为了在一次遍历中不要重复访问已访问过的字符。一次不成功的搜索之后,访问过的元素(flag 值为 true)应该需要再次置为 false。在下一次搜索时应该还可以访问这些元素,也就是说,flag 数组的值有一个回退的动作,*/boolean solve(char[][] board,int i,int j,String word,int count){if(count==word.length())//退出条件return true;flag[i][j]=true; //flag 中的当前元素以访问,置为 trueboolean re=false;//保存退出返回值for(int k=0;k<4;k++){int newI=i+addi[k],newJ=j+addj[k];if(newI<0||newJ<0||newI>=board.length||newJ>=board[0].length||flag[newI][newJ]==true)continue;if(board[newI][newJ]==word.charAt(count))//一种可能成功的情况re=re||solve(board,newI,newJ,word,count+1);//这里为或操作}flag[i][j]=false; //flag 重新恢复为falsereturn re;}

算法2:另外一种描述方法如下(添加一个 boolean 变量 ans 来判断是否搜索到字符串):

int[] addi={1,-1,0,0};int[] addj={0,0,1,-1};boolean[][] flag;boolean ans;public boolean exist(char[][] board, String word) {int m=board.length,n=board[0].length;flag=new boolean[m][n];for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(board[i][j]==word.charAt(0)){solve(board,i,j,word,1);if(ans==true)return true;}}}return false;}void solve(char[][] board,int i,int j,String word,int count){if(count==word.length()){ans=true;return;}flag[i][j]=true;for(int k=0;k<4;k++){int newI=i+addi[k],newJ=j+addj[k];if(newI<0||newJ<0||newI>=board.length||newJ>=board[0].length||flag[newI][newJ]==true)continue;if(board[newI][newJ]==word.charAt(count))solve(board,newI,newJ,word,count+1);}flag[i][j]=false;}

小小的优化

算法1 和 2 都还需要优化,它们都有同一个问题,在搜索到字符串之后不会立即返回,这样会浪费时间的。算法1 改进如下:

 for(int k=0;k<4;k++){int newI=i+addi[k],newJ=j+addj[k];if(newI<0||newJ<0||newI>=board.length||newJ>=board[0].length||flag[newI][newJ]==true)continue;if(board[newI][newJ]==word.charAt(count)){re=re||solve(board,newI,newJ,word,count+1);if(re)break;}}

一旦搜索到字符串之后,此时re 为 true,短路 || 不会执行 solve(board,newI,newJ,word,count+1) ,但是也应该加上 break 语句让程序执行跳出 for 循环,直接退出返回正确的结果。相应的也可对算法 2 进行优化。

总结

深度优先遍历是回溯算法使用的策略。

LeetCode算法题13:DFS/BFS - 单词搜索相关推荐

  1. LeetCode算法题整理(200题左右)

    目录 前言 一.树(17) 1.1.后序遍历 1.2.层次遍历 1.3.中序 1.4.前序 二.回溯(20) 2.1.普通回溯 2.2.线性回溯:组合.排列.子集.分割 2.3.矩阵回溯 三.二分查找 ...

  2. LeetCode算法总结-回溯法与深度优先搜索

    转载自  LeetCode算法总结-回溯法与深度优先搜索 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退 ...

  3. leetcode算法题--不同的二叉搜索树

    原题链接:https://leetcode-cn.com/problems/unique-binary-search-trees/ 相关题目:leetcode算法题--不同的二叉搜索树 II 1.递归 ...

  4. 【算法】LeetCode算法题-Maximum Subarray

    这是悦乐书的第154次更新,第156篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第13题(顺位题号是53).给定一个整数数组nums,找出一个最大和,此和是由数组中索引 ...

  5. LeetCode算法题-Design LinkedList(Java实现)

    这是悦乐书的第300次更新,第319篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第168题(顺位题号是707).设计链表的实现.您可以选择使用单链表或双链表.单链表中的 ...

  6. LeetCode算法题-Detect Capital(Java实现)

    这是悦乐书的第251次更新,第264篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第118题(顺位题号是520).给定一个单词,你需要判断其中大写字母的使用是否正确.当下 ...

  7. LeetCode算法题-Goat Latin Easy(Java实现)

    这是悦乐书的第322次更新,第344篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第192题(顺位题号是824).给出句子S,由空格分隔的单词组成.每个单词仅由小写和大写 ...

  8. LeetCode高频题13:罗马数字转整数

    LeetCode高频题13:罗马数字转整数 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目 互联网大厂们在公司养了一大批ACM ...

  9. LeetCode算法题-Nth Digit(Java实现)

    这是悦乐书的第215次更新,第228篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第83题(顺位题号是400).找到无限整数序列的第n个数字1,2,3,4,5,6,7,8 ...

最新文章

  1. 源目标OKR— 在线团队协同办公、项目管理工具
  2. 字符串与byte[]之间的转换
  3. java.io包有哪些方法_java.io包下常用类及常用方法介绍
  4. 洛谷——P1183 多边形的面积
  5. 6远程桌面连接不上_windows server2008 远程桌面 创建新用户和多用户登录
  6. 简单的事情搞复杂:挂个版本到网站,拖了几个月还没做
  7. 店宝宝:电商直播被“敲响警钟”了
  8. 使用rarcrack暴力破解RAR,ZIP,7Z压缩包
  9. 基于js利用经纬度进行两地的距离计算(转)
  10. E71(S60 3rd)通话录音软件 -终极录音- 的用法
  11. 知网查重提交论文显示服务器错误,职称论文在进行知网查重时,经常出现的错误有哪些?...
  12. 如何进入DOS系统 | 常用DOS系统命令
  13. Google预训练语言模型T5
  14. 自建ngrok私服, 总是提示 Tunnel xxx.ngrok.mydomain.com not found
  15. TMOS系统之Trunks
  16. 【解锁】Pandoc——Pandoc安装、使用、快速上手
  17. Word Maze单词迷宫C语言解法(详细注解)
  18. qgjsfagafgpjqip
  19. python研究背景与意义_研究背景与意义
  20. Counting Cards 函数实现21点算法

热门文章

  1. LeetCode10.正则表达式匹配 JavaScript
  2. JMeter中的HTTPS套接字错误
  3. php获取ios或android通过文件头(header)传过来的坐标,通过百度接口获取具体城市和地址,并存入到session中...
  4. 2014年12月日本語能力試験N3聴解部分
  5. window.event
  6. kettle中通过 时间戳(timestamp)方式 来实现数据库的增量同步操作(一)
  7. 第19章 归档模式下的数据库恢复
  8. MSChart使用导航之开发
  9. 神经网络与机器学习 笔记—基本知识点(下)
  10. 计算机网络第五章:运输层