leetcode 79. Word Search 、212. Word Search II
https://www.cnblogs.com/grandyang/p/4332313.html
在一个矩阵中能不能找到string的一条路径
这个题使用的是dfs。但这个题与number of islands有点不同,那个题中visited过的就不用再扫了,但是这个需要进行回溯回来。
所以使用了visited[i][j] = false;
本质区别还是那个题是找一片区域,这个题更像是找一条路径。
错误一:如果board不引用,会报超内存
错误二:
这个写法和正确写法基本相同,但错误写法需要每次都去遍历flag1、flag2、flag3、flag4,正确写法中,如果flag1为真,就不用再去遍历flag2、3、4,这样就节省了许多时间。
所以这个写法报的错误是在有一个比较大的case超时。
https://blog.csdn.net/CV2017/article/details/82659742
或运算符,左右两边通常为关系或相等表达式,第一个操作数将完全运算,仅当第一个操作数的计算结果为 false 时计算第二个操作数,当第一个操作数的计算结果为 true 时,不用计算第二个操作数和这之后的操作数,直接运行后面的代码了
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
int m = board.size();
int n = board[].size();
vector<vector<bool> > visited(m,vector<bool>(n));
for(int i = ;i < m;i++){
for(int j = ;j < n;j++){
int index = ;
if(exit(board,word,i,j,index,visited))
return true;
}
}
return false;
}
bool exit(vector<vector<char>>& board,string word,int i,int j,int index,vector<vector<bool>>& visited){
if(index == word.size())
return true;
if(i < || i >= board.size() || j < || j >= board[].size() || visited[i][j] == true || board[i][j] != word[index])
return false;
visited[i][j] = true;
bool flag1 = exit(board,word,i - ,j,index+,visited);
bool flag2 = exit(board,word,i + ,j,index+,visited);
bool flag3 = exit(board,word,i,j - ,index+,visited);
bool flag4 = exit(board,word,i,j + ,index+,visited);
visited[i][j] = false;
return flag1 || flag2 || flag3 || flag4;
}
};
正确写法:
如果第一个字符不相同,就继续遍历,这个操作可以减少搜索的个数
vector<vector<bool>> visited(m,vector<bool>(n,false));不要写在for循环里面,其实每次递归都是将置为true的又置为了false的。
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
int m = board.size();
int n = board[].size();
vector<vector<bool> > visited(m,vector<bool>(n,false));
for(int i = ;i < m;i++){
for(int j = ;j < n;j++){
if(board[i][j] != word[])
continue;
int index = ;
if(exit(board,word,i,j,index,visited))
return true;
}
}
return false;
}
bool exit(vector<vector<char>>& board,string word,int i,int j,int index,vector<vector<bool>>& visited){
if(index == word.size())
return true;
if(i < || i >= board.size() || j < || j >= board[].size() || visited[i][j] == true || board[i][j] != word[index])
return false;
visited[i][j] = true;
bool res = exit(board,word,i - ,j,index+,visited) || exit(board,word,i + ,j,index+,visited) || exit(board,word,i,j - ,index+,visited) || exit(board,word,i,j + ,index+,visited);
visited[i][j] = false;
return res;
}
};
212. Word Search II
https://www.cnblogs.com/grandyang/p/4516013.html
这个题是trie树与dfs相结合的题目,将所有需要搜索的词存入trie树当中,然后在二维数组中dfs搜索。
这个题的trie树的定义和leetcode 208. Implement Trie (Prefix Tree) 、211. Add and Search Word - Data structure design的不太一样,208、211定义了一个isWord
用来表示是否是词的结尾。这个题定义的则是一个string,并且这个string存储的就是整个单词,这样既可以用来表示结尾,又可以获得搜索的整个词。这样做主要是由于
这个题目本身要求返回搜索成功的词。
这个题在搜索到词后,还需要clear掉str,因为题目要求同一个词只返回一个,例子如下:
Input:
[["a","a"]]
["a"]
Output:
["a","a"]
Expected:
["a"]
class Solution {
public:
struct TrieNode{
TrieNode* child[];
string str;
TrieNode():str(""){
for(int i = ;i < ;i++)
child[i] = NULL;
}
};
struct Trie{
TrieNode* root;
Trie():root(new TrieNode()){
}
void insert(string s){
TrieNode* p = root;
for(char tmp : s){
int i = tmp - 'a';
if(!p->child[i])
p->child[i] = new TrieNode();
p = p->child[i];
}
p->str = s;
return;
}
};
vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
vector<string> res;
if(board.empty() || board[].empty() || words.empty())
return res;
int m = board.size(),n = board[].size();
Trie T;
for(string word : words)
T.insert(word);
vector<vector<bool>> visited(m,vector<bool>(n,false));
for(int i = ;i < m;i++){
for(int j = ;j < n;j++){
if(T.root->child[board[i][j] - 'a'])
findWords(board,T.root->child[board[i][j] - 'a'],visited,i,j,res);
}
}
return res;
}
void findWords(vector<vector<char>>& board,TrieNode* p,vector<vector<bool>>& visited,int i,int j,vector<string>& res){
if(!p->str.empty()){
res.push_back(p->str);
p->str.clear();
}
visited[i][j] = true;
for(auto dir : dirs){
int x = i + dir[];
int y = j + dir[];
if(x < || x >= board.size() || y < || y >= board[].size() || visited[x][y] == true || p->child[board[x][y] - 'a'] == NULL)
continue;
findWords(board, p->child[board[x][y] - 'a'],visited, x, y, res);
}
visited[i][j] = false;
return;
}
private:
vector<vector<int>> dirs{{-,},{,},{,-},{,}};
};
leetcode 79. Word Search 、212. Word Search II的更多相关文章
- Leetcode之回溯法专题-212. 单词搜索 II(Word Search II)
Leetcode之回溯法专题-212. 单词搜索 II(Word Search II) 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单 ...
- python如何转换word格式、读取word内容、转成html
# python如何转换word格式.读取word内容.转成html? import docx from win32com import client as wc # 首先将doc转换成docx wo ...
- leetcode@ [79/140] Trie树应用 Word Search / Word Search II
https://leetcode.com/problems/word-search/ class Solution { public: struct Trie{ Trie *next[]; bool ...
- leetcode 139. Word Break 、140. Word Break II
139. Word Break 字符串能否通过划分成词典中的一个或多个单词. 使用动态规划,dp[i]表示当前以第i个位置(在字符串中实际上是i-1)结尾的字符串能否划分成词典中的单词. j表示的是以 ...
- leetcode 127. Word Ladder、126. Word Ladder II
127. Word Ladder 这道题使用bfs来解决,每次将满足要求的变换单词加入队列中. wordSet用来记录当前词典中的单词,做一个单词变换生成一个新单词,都需要判断这个单词是否在词典中,不 ...
- leetcode 169. Majority Element 、229. Majority Element II
169. Majority Element 求超过数组个数一半的数 可以使用hash解决,时间复杂度为O(n),但空间复杂度也为O(n) class Solution { public: int ma ...
- leetcode 54. Spiral Matrix 、59. Spiral Matrix II
54题是把二维数组安卓螺旋的顺序进行打印,59题是把1到n平方的数字按照螺旋的顺序进行放置 54. Spiral Matrix start表示的是每次一圈的开始,每次开始其实就是从(0,0).(1,1 ...
- leetcode 263. Ugly Number 、264. Ugly Number II 、313. Super Ugly Number 、204. Count Primes
263. Ugly Number 注意:1.小于等于0都不属于丑数 2.while循环的判断不是num >= 0, 而是能被2 .3.5整除,即能被整除才去除这些数 class Solution ...
- leetcode 344. Reverse String 、541. Reverse String II 、796. Rotate String
344. Reverse String 最基础的旋转字符串 class Solution { public: void reverseString(vector<char>& s) ...
随机推荐
- ASE19团队项目 beta阶段 model组 scrum7 记录
本次会议于12月10日,19时30分在微软北京西二号楼sky garden召开,持续10分钟. 与会人员:Jiyan He, Lei Chai, Linfeng Qi, Xueqing Wu, Kun ...
- LINUX安装Tree软件包
1.将镜像光盘放入光驱中 查看当前LINUX版本号:cat /etc/redhat-release 2.挂载镜像文件 mount /dev/cdrom /mnt mount :挂载设备命令 /d ...
- Spring3.2.2中相关Jar包的作用
今天在看Spring的源码的时候不知道从什么地方开启应该合适,因为不太清楚实现类所在的具体Jar包,就从网上找了些,可是网上有的说的是不清不楚,甚至是有些错误的,所以就把相关Jar包的大致作用给整理了 ...
- 《python解释器源码剖析》第12章--python虚拟机中的函数机制
12.0 序 函数是任何一门编程语言都具备的基本元素,它可以将多个动作组合起来,一个函数代表了一系列的动作.当然在调用函数时,会干什么来着.对,要在运行时栈中创建栈帧,用于函数的执行. 在python ...
- “高可用性”(High Availability)??
“高可用性”(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性. 计算机的高可用性 计算机系统的可用性用平均无故障时间(MTTF)来度量 ...
- PAT Basic 1088 三人行 (20 分)
子曰:“三人行,必有我师焉.择其善者而从之,其不善者而改之.” 本题给定甲.乙.丙三个人的能力值关系为:甲的能力值确定是 2 位正整数:把甲的能力值的 2 个数字调换位置就是乙的能力值:甲乙两人能力差 ...
- webpack中typeScript的打包配置
2018年typescript发展的非常好,js是一门非常灵活的语言,所以一个功能,怎么写都能够写出来,但是这也会导致一个问题,不同人写js的方式不同,那么会导致同一个功能出现的代码风格会迥然不同.这 ...
- less-@arguments变量
@arguments变量:包含了所有传递进来的参数. 如果你不想单独处理每一个参数的话可以像这样写: /*arguments*/ //之前这么写 .border_arg(@w:30px,@c:red, ...
- GAN学习指南:从原理入门到制作生成Demo,总共分几步?
来源:https://www.leiphone.com/news/201701/yZvIqK8VbxoYejLl.html?viewType=weixin 导语:本文介绍下GAN和DCGAN的原理,以 ...
- webpac4k运行webpack .\src\main.js .\dist\bundle.js打包出错
打包的命令格式:webpack 要打包的文件的路径 打包好的输出文件的路径 运行webpack .\src\main.js .\dist\bundle.js 提示错误,错误信息如下: WARNING ...