LeetCode算法题13:DFS/BFS - 单词搜索
文章目录
- 单词搜索
- 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 - 单词搜索相关推荐
- LeetCode算法题整理(200题左右)
目录 前言 一.树(17) 1.1.后序遍历 1.2.层次遍历 1.3.中序 1.4.前序 二.回溯(20) 2.1.普通回溯 2.2.线性回溯:组合.排列.子集.分割 2.3.矩阵回溯 三.二分查找 ...
- LeetCode算法总结-回溯法与深度优先搜索
转载自 LeetCode算法总结-回溯法与深度优先搜索 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退 ...
- leetcode算法题--不同的二叉搜索树
原题链接:https://leetcode-cn.com/problems/unique-binary-search-trees/ 相关题目:leetcode算法题--不同的二叉搜索树 II 1.递归 ...
- 【算法】LeetCode算法题-Maximum Subarray
这是悦乐书的第154次更新,第156篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第13题(顺位题号是53).给定一个整数数组nums,找出一个最大和,此和是由数组中索引 ...
- LeetCode算法题-Design LinkedList(Java实现)
这是悦乐书的第300次更新,第319篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第168题(顺位题号是707).设计链表的实现.您可以选择使用单链表或双链表.单链表中的 ...
- LeetCode算法题-Detect Capital(Java实现)
这是悦乐书的第251次更新,第264篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第118题(顺位题号是520).给定一个单词,你需要判断其中大写字母的使用是否正确.当下 ...
- LeetCode算法题-Goat Latin Easy(Java实现)
这是悦乐书的第322次更新,第344篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第192题(顺位题号是824).给出句子S,由空格分隔的单词组成.每个单词仅由小写和大写 ...
- LeetCode高频题13:罗马数字转整数
LeetCode高频题13:罗马数字转整数 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目 互联网大厂们在公司养了一大批ACM ...
- LeetCode算法题-Nth Digit(Java实现)
这是悦乐书的第215次更新,第228篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第83题(顺位题号是400).找到无限整数序列的第n个数字1,2,3,4,5,6,7,8 ...
最新文章
- 源目标OKR— 在线团队协同办公、项目管理工具
- 字符串与byte[]之间的转换
- java.io包有哪些方法_java.io包下常用类及常用方法介绍
- 洛谷——P1183 多边形的面积
- 6远程桌面连接不上_windows server2008 远程桌面 创建新用户和多用户登录
- 简单的事情搞复杂:挂个版本到网站,拖了几个月还没做
- 店宝宝:电商直播被“敲响警钟”了
- 使用rarcrack暴力破解RAR,ZIP,7Z压缩包
- 基于js利用经纬度进行两地的距离计算(转)
- E71(S60 3rd)通话录音软件 -终极录音- 的用法
- 知网查重提交论文显示服务器错误,职称论文在进行知网查重时,经常出现的错误有哪些?...
- 如何进入DOS系统 | 常用DOS系统命令
- Google预训练语言模型T5
- 自建ngrok私服, 总是提示 Tunnel xxx.ngrok.mydomain.com not found
- TMOS系统之Trunks
- 【解锁】Pandoc——Pandoc安装、使用、快速上手
- Word Maze单词迷宫C语言解法(详细注解)
- qgjsfagafgpjqip
- python研究背景与意义_研究背景与意义
- Counting Cards 函数实现21点算法
热门文章
- LeetCode10.正则表达式匹配 JavaScript
- JMeter中的HTTPS套接字错误
- php获取ios或android通过文件头(header)传过来的坐标,通过百度接口获取具体城市和地址,并存入到session中...
- 2014年12月日本語能力試験N3聴解部分
- window.event
- kettle中通过 时间戳(timestamp)方式 来实现数据库的增量同步操作(一)
- 第19章 归档模式下的数据库恢复
- MSChart使用导航之开发
- 神经网络与机器学习 笔记—基本知识点(下)
- 计算机网络第五章:运输层