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) ...
随机推荐
- element-ui组件,全选树节点,新增数据子节点数据,出现回填问题
案情分析:全选后父节点被选中保存,在这个树节点下新增数据时,就会出现,也被选中,事实上数据是没有被选中,也就意味着权限未被配置,而显示是已经配置了,显然这个是一个bug 1.处理前,直接用下面的方法很 ...
- css中 禁止spa有点击状态
<span class="an" onclick="selNum();"></span> var selNum = function() ...
- 解析.conf配置文件
解析.conf配置文件 解析.conf配置文件 解析.conf配置文件
- 创建conda虚拟环境以及python的virtualenv虚拟环境
我觉得我,嗯...可能脑袋里面有水 首先说一个,就是我电脑安装了conda2和conda3,原来怎么查看conda版本都是2,所以就没有创建虚拟环境 系统变量里面的path要改,总共有3个: D:\A ...
- 201871010111-刘佳华《面向对象程序设计(java)》第十七周学习总结
201871010111-刘佳华<面向对象程序设计(java)>第十七周学习总结 实验十七 线程同步控制 实验时间 2019-12-20 第一部分:理论知识总结 16.Java 的线程调 ...
- MongoDB同步机制
复制 在此页 冗余和数据可用性 在MongoDB中复制 异步复制 自动故障转移 读取操作 交易次数 更改流 附加的功能 甲副本集 MongoDB中是一组mongod其保持相同的数据集的过程.副本集提供 ...
- Vue结合后端DjangoFramework的在线生鲜超市(前后端分离)【django2.2+xadmin+ueditor】
在线博客教程:https://www.cnblogs.com/Eric15/category/1300432.html https://www.cnblogs.com/derek1184405959/ ...
- date对象获取get
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Educational Codeforces Round 39 (Rated for Div. 2) 946E E. Largest Beautiful Number
题: OvO http://codeforces.com/contest/946/problem/E CF 946E 解: 记读入串为 s ,答案串为 ans,记读入串长度为 len,下标从 1 开始 ...
- AtCoder Beginner Contest 142【D题】【判断素数的模板+求一个数的因子的模板】
D - Disjoint Set of Common Divisors Problem Statement Given are positive integers AA and BB. Let us ...