1.1我的想法
矩阵中的路径搜索,一般用深度优先收索,
1、走一步
1)设定一个数组表示四个不同的查找的方向,
2)检测是否四个查找方向在矩阵的范围内,如果不在(就换一个方向走)
2、条件判断
1)表示目标字符串中的某一个下标随着步数的增加而增加,检测当前矩阵中的方格是否与目标字符串中对应的下标一致,如果一致就接着走
2)如果不一致就从头开始计数(这个地方我没有处理好)
3)如果最终计数的长度和目标的字符串一致,就返回true表示存在
4)但由于多次返回false会导致其中的一个true被覆盖,所以要特别抓住(额外开一个数字存储,其实这个时候就可以考虑结束程序)

一个错误的程序
出错点
1)没有标识该路径是否走过,可能会重复使用同一个字符
2)进入dfs之前没有对当下的board和word中的字符是否相同作为比较
3)进入dfs之后也没有立即对于当前的board和word中的字符是否相同作为比较
4)而是对于下一个做了比较
5)我是以下标刚好越界一个作为检测终止的条件的

出错分析:
为什么必须在刚进入dfs是判断board里面和对应位置上的字符是否一致呢?
dfs何时返回,返回之后要做什么?
1)路径走到底,符合条件的时候返回
2)路径没有到底,但是这个方向不符合要求,应该返回上一步,然后从上一步再换一个方向走下一步。这里应该有个返回

class Solution {public:bool exist(vector<vector<char>>& board, string word) {int m = board.size();int n = board[0].size();if(m == 0 || n == 0)return false;bool ret = false;for(int i = 0; i < m ;i++){for(int j = 0; j < n;j++){ret = dfs(board,word,0,i,j);if(ret){return true;}}}return ret;}bool dfs(vector<vector<char>>& board, string word,int size,int tx,int ty){if(size == word.size()){return true;}//累加到的字符串的长度为word的时候表明已经找到int next[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};//需要向方格的四个方向行走bool res = false;for(int k = 0;k < 4;k++){tx += next[k][0];ty += next[k][1];//这里也是一个错误,这样写的话会导致tx,ty是自第一次调用dfs贯穿始终的变量,但是每次调用dfs都有其相对应的x和y,因此每一层都得额外开辟空间来保留,只想用两个变量贯穿始终会导致返回上一层的时候tx,ty已经被改变,这会导致换方向前行的时候计算的坐标会是有问题的。if(tx >= 0 && ty >= 0 && tx < board.size() && ty < board[0].size()){//我在这里犯了一个很大的错误,我以为每进入一个dfs就相当于走了一步,实际上tx,ty的值发生了变化之后就算走了一步//在进入一个dfs之前判断是否于对应位置上的字符相同会导致,如果不符合不会进入下一层,但是会在这个不能进入下一层的一步的基础上再走一步,而不是回到上一步再换个方向向下走if(board[tx][ty] == word[size]){res = dfs(board,word,size+1,tx,ty);if(res)return true;}else dfs(board,word,0,tx,ty);}}return res;}
};

黑色路径为上面程序的路径,红色路径为正确答案应该有的路径
应该在进入dfs第一时间就判断对应位置上的字符是否合适,否则直接返回上一级,便于换一个方向继续向下一级探索

1.2根据上面所暴露出来的问题,所更改的

bool exist(vector<vector<char>>& board, string word) {int m = board.size();int n = board[0].size();vector<vector<bool>> visit(m,vector<bool>(n,false));bool ret = false;for(int i = 0; i < m ;i++){for(int j = 0; j < n;j++){if(visit[i][j] == false){visit[i][j] = true;ret = dfs(board,word,0,i,j,visit);if(ret){return true;}}}}return ret;}bool dfs(vector<vector<char>>& board, string word,int size,int tx,int ty,vector<vector<bool>>& visit){if(board[tx][ty] != word[size]){visit[tx][ty] = false;return false;}else if(size == word.size()-1)return true;int next[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};bool res = false;int x,y;for(int k = 0;k < 4;k++){x = tx + next[k][0];y = ty + next[k][1];if(x >= 0 && y >= 0 && x < board.size() && y < board[0].size()){if(visit[x][y] == false){visit[x][y] = true;bool flag = dfs(board,word,size+1,x,y,visit);if(flag){res = true;break;}//return true;}}}visit[tx][ty] = false;//其实不太明白这个应该放在哪里return res;}

官方的答案

bool dfs(vector<vector<char>>& board, string word,int count,int x,int y,vector<vector<bool>>& visit){if(board[x][y] != word[count])//其实我不是很明白,先进去再判断和先判断再允许进入该函数有什么区别return false;else if(count == word.size() - 1)//第一个符合就会以0开始进入return true;visit[x][y] = true;//明白了为什么不再进入之前判断,//进入之前不知道这个到底能不能真的进入,所以贸然标记为走过其实并不是很好bool result = false;int tx,ty;vector<pair<int,int>> next{{0,1},{1,0},{0,-1},{-1,0}};for(const auto &a : next ){tx = x + a.first;ty = y + a.second;if(tx >= 0 && tx < board.size() && ty >= 0 && ty < board[0].size()){if(!visit[tx][ty]){bool flag = dfs(board,word,count+1,tx,ty,visit);if(flag){result = true;break;//只要满足条件之后就剪枝返回给上一级}}}}visit[x][y] = false;//如果for循环进不去这个格子相当于无法进入,因为无法通过这个格子去到另外的地方return result;//这个才是逐层交付给上一级的结果}bool exist(vector<vector<char>>& board, string word) {int m = board.size();int n = board[0].size();bool ret = false;int count = 0;vector<vector<bool>> visit(m,vector<bool>(n,false));for(int i = 0;i < m;i++)for(int j = 0;j < n;j++){ret = dfs(board,word,count,i,j,visit);if(ret) return true;}   return false;}

问题:都是用了dfs,为什么速度差那么多?

2021-06-13Leetcode79.单词搜索相关推荐

  1. 2021.06.03邮票面值设计

    2021.06.03邮票面值设计 题目描述 给定一个信封,最多只允许粘贴 N 张邮票,计算在给定 K(N+K≤15)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值 MAX ...

  2. Mculover666的博客文章导航(嵌入式宝藏站)(2021.06.17更新)

    一.MCU系列 1. 开发环境 [Keil MDK](一)Keil MDK 5.28 的下载.安装.破解 [Keil MDK](二)Keil MDK中芯片器件包的安装 [Keil MDK](三)Kei ...

  3. 华为机试:单词搜索(找到它)

    [编程题目 |200分] 单词搜索[2021 H2, 2022 Q1,Q2 考试题] 题目描述 找到它是一个小游戏,你需要在一个矩阵中找到给定的单词. 假设给定单词 HELLOWORD,在矩阵中只要能 ...

  4. 【每日一题】212. 单词搜索 II

    212. 单词搜索 II 题目描述: 给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过 相邻 ...

  5. LeetCode算法题13:DFS/BFS - 单词搜索

    文章目录 单词搜索 DFS : 小小的优化 总结 单词搜索 题目链接:https://leetcode-cn.com/problems/word-search/ 题目描述: 给定一个 m x n 二维 ...

  6. C++words search单词搜索的算法实现(附完整源码)

    C++words search单词搜索的算法实现 C++words search单词搜索的算法实现完整源码(定义,实现,main函数测试) C++words search单词搜索的算法实现完整源码(定 ...

  7. LeetCode 212. 单词搜索 II(Trie树+DFS)

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

  8. mysql 相关搜索_MySQL单词搜索相关度排名

    一个单词搜索的相关度排名,这个例子演示了一个单词搜索的相关度排名计算. mysql> CREATE TABLE articles ( -> id INT UNSIGNED AUTO_INC ...

  9. 力扣—— 79/212. 单词搜索

    目录 79 单词搜索 212 单词搜索II 79 单词搜索 class Solution(object):#深度搜索def exist(self, board, word):self.flag=0se ...

  10. Leetcode 79.单词搜索

    Time: 20190901 Type: Medium 题目描述 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻&q ...

最新文章

  1. 强化学习如何真正实现任务自动化?不妨试试「两步走」策略!
  2. java常用集合类详解(有例子,集合类糊涂的来看!)
  3. 008_Redis的ZSet数据类型
  4. db2分页查询语句优化_数据量很大,分页查询很慢,该怎么优化?
  5. 计算机无法检测电池损耗怎么办,笔记本电脑无法充电怎么办?笔记本电池损耗如何修复?...
  6. 常用输入法隐藏的这些神奇功能
  7. seek()方法的使用
  8. python pymysql mysql保存表情符
  9. mac命令行更新gradle
  10. winform使用CefSharp嵌入浏览器
  11. 华为测试心率软件,华为运动健康如何测心率 华为运动健康测心率方法
  12. http://ai.taobao.com/?pid=mm_40428920_1105750338_109783200329
  13. read函数和fread函数的区别
  14. 这篇 Java 基础,我吹不动了
  15. 都说要计算卡路里,但到底要怎么算?
  16. springboot2+mybatisplus+redis+generator代码生成器环境搭建
  17. D3.js实现力导向图(Dray和Zoom)
  18. 获取mysql 自增id 和mysql 下一个自增id的方法
  19. c语言中htonl函数,htonl()函数学习
  20. 基于stc89c51单片机的温控风扇(程序代码+原理图)

热门文章

  1. Footprints:一款真正的“千里眼”应用
  2. 基于Mask的音频降噪
  3. P2400 秘密文件(区间dp)
  4. scratch编程选择排序
  5. 使用Verilog设计1553B总线协议芯片
  6. 你竟然是这样的端智能?
  7. 基于matlab的头脑风暴优化(Brain Storm Optimization Algorithm,BSO)的多目标优化仿真
  8. CMMI组织结构和岗位保证
  9. Springboot+Redis 实现API接口限流
  10. 数据库字段为什么要使用NOT NULL