leetcode@ [79/140] Trie树应用 Word Search / Word Search II
https://leetcode.com/problems/word-search/
class Solution {
public:
struct Trie{
Trie *next[];
bool isWord;
Trie() {
this->isWord = false;
for(auto &c: next) c = NULL;
}
};
void insert(Trie *root, string word) {
Trie *p = root;
for(auto &c: word) {
int idx = c - 'A';
if(!p->next[idx]) p->next[idx] = new Trie();
p = p->next[idx];
}
p->isWord = true;
}
bool isPrefix(Trie *root, string word) {
Trie *p = root;
for(auto &c: word) {
int idx = c - 'A';
if(!p->next[idx]) return false;
p = p->next[idx];
}
return true;
}
bool isWord(Trie *root, string word) {
Trie *p = root;
for(auto &c: word) {
int idx = c - 'A';
if(!p->next[idx]) return false;
p = p->next[idx];
}
return p->isWord;
}
bool check(vector<vector<char>> &board, int x, int y) {
int m = board.size(), n = board[].size();
if(x< || y< || x>=m || y>=n) return false;
return true;
}
bool dfs(vector<vector<char>> &board, vector<vector<bool>> &vis, Trie *root, string s, int x, int y) {
if(isWord(root, s))
return true;
}
int dir[][] = {{,}, {,}, {-,}, {,-}};
for(int i=;i<;++i) {
int nx = x + dir[i][], ny = y + dir[i][];
if(check(board, nx, ny) && !vis[nx][ny]) {
if(isPrefix(root, s + board[nx][ny])) {
vis[nx][ny] = true;
if(dfs(board, vis, root, s + board[nx][ny], nx, ny)) return true;
vis[nx][ny] = false;
}
}
}
return false;
}
bool exist(vector<vector<char>>& board, string word) {
if (board.empty() || board[].empty() || word.empty()) return false;
string s = "";
int m = board.size(), n = board[].size();
vector<vector<bool>> vis(m, vector<bool>(n, false));
Trie *root = new Trie();
insert(root, word);
for(int i=;i<m;++i) {
for(int j=;j<n;++j) {
//if(isWord(root, s + board[i][j])) return true;
if(isPrefix(root, s)) {
vis[i][j] = true;
if(dfs(board, vis, root, s + board[i][j], i, j)) return true;
vis[i][j] = false;
}
}
}
return false;
}
};
https://leetcode.com/problems/word-search-ii/
struct TriNode {
TriNode *ch[];
bool isWord;
TriNode() : isWord(false) {
for (auto &a : ch) a = NULL;
}
};
class Solution {
public:
void insert(TriNode *root, string word) {
TriNode *p = root;
for (auto &a : word) {
int i = a - 'a';
if (p->ch[i] == NULL) p->ch[i] = new TriNode();
p = p->ch[i];
}
p->isWord = true;
}
bool isPrefix(TriNode *root, string word) {
TriNode *p = root;
for (auto &a : word) {
int i = a - 'a';
if (p->ch[i] == NULL) return false;
p = p->ch[i];
}
return true;
}
bool isWord(TriNode *root, string word) {
TriNode *p = root;
for (auto &a : word) {
int i = a - 'a';
if (p->ch[i] == NULL) return false;
p = p->ch[i];
}
return p->isWord;
}
bool isValid(vector<vector<char>> &board, int x, int y) {
int m = board.size(), n = board[].size();
if (x < || x >= m || y < || y >= n) return false;
return true;
}
void dfs(vector<vector<char>> board, vector<vector<int>> visit, set<string> &st, string s, TriNode *root, int x, int y) {
if(!isPrefix(root, s)) return;
if(isWord(root, s)) {
st.insert(s);
}
int dx[] = {, -, , };
int dy[] = {, , , -};
int xx, yy;
for (int i = ; i < ; ++i) {
xx = x + dx[i]; yy = y + dy[i];
if (isValid(board, xx, yy) && !visit[xx][yy]) {
visit[xx][yy] = ;
dfs(board, visit, st, s + board[xx][yy], root, xx, yy);
visit[xx][yy] = ;
}
}
}
vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
vector<string> res; res.clear();
if (board.empty() || board[].empty() || words.empty()) return res;
TriNode *root = new TriNode();
for(auto &word : words) insert(root, word);
int m = board.size(), n = board[].size();
vector<vector<int>> visit(m, vector<int>(n, ));
string s="";
set<string> st; st.clear();
for (int i = ; i < m; ++i) {
for (int j = ; j < n; ++j) {
visit[i][j] = ;
dfs(board, visit, st, s + board[i][j], root, i, j);
visit[i][j] = ;
}
}
for (auto &word : st) res.push_back(word);
return res;
}
};
leetcode@ [79/140] Trie树应用 Word Search / Word Search II的更多相关文章
- 字典树(查找树) leetcode 208. Implement Trie (Prefix Tree) 、211. Add and Search Word - Data structure design
字典树(查找树) 26个分支作用:检测字符串是否在这个字典里面插入.查找 字典树与哈希表的对比:时间复杂度:以字符来看:O(N).O(N) 以字符串来看:O(1).O(1)空间复杂度:字典树远远小于哈 ...
- leetcode 211. Add and Search Word - Data structure design Trie树
题目链接 写一个数据结构, 支持两种操作. 加入一个字符串, 查找一个字符串是否存在.查找的时候, '.'可以代表任意一个字符. 显然是Trie树, 添加就是正常的添加, 查找的时候只要dfs查找就可 ...
- leetcode 79. Word Search 、212. Word Search II
https://www.cnblogs.com/grandyang/p/4332313.html 在一个矩阵中能不能找到string的一条路径 这个题使用的是dfs.但这个题与number of is ...
- LeetCode 79 Word Search(单词查找)
题目链接:https://leetcode.com/problems/word-search/#/description 给出一个二维字符表,并给出一个String类型的单词,查找该单词是否出现在该二 ...
- [leetcode trie]211. Add and Search Word - Data structure design
Design a data structure that supports the following two operations: void addWord(word) bool search(w ...
- [LeetCode] 79. Word Search 单词搜索
Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...
- [leetcode]79.Search Word 回溯法
/** * Given a 2D board and a word, find if the word exists in the grid. The word can be constructed ...
- [LeetCode] Add and Search Word - Data structure design 添加和查找单词-数据结构设计
Design a data structure that supports the following two operations: void addWord(word) bool search(w ...
- leetcode@ [211] Add and Search Word - Data structure design
https://leetcode.com/problems/add-and-search-word-data-structure-design/ 本题是在Trie树进行dfs+backtracking ...
随机推荐
- hdu 2897 邂逅明下 博弈论
这个分区间: 1<=n%(p+q)<=p 必败 其他必胜! 代码如下: #include<iostream> #include<stdio.h> #include& ...
- Java 垃圾回收机制
1.delete是C++里面用于释放内存的运算符,而不是Java. 2.当发现某个对象的引用计数为0时,就将对象列入待回收列表中,并不是马上予以销毁. 3.System.gc()仅仅是一个回收请求,J ...
- MetadataType的使用
MetadataType的使用,MVC的Model层数据验证指定要与数据模型类关联的元数据类 using System.ComponentModel.DataAnnotations; //指定要与数据 ...
- http://blog.csdn.net/xyang81/article/details/7292380
http://blog.csdn.net/xyang81/article/details/7292380
- Qt: 绘图基础(非常简洁明了,全面)
QPainter 能绘制: point, line, rectangle, ellipse, arc, chord, polygon, pie segment, Bezier curve, QPixm ...
- 常用JVM配置参数
常用JVM配置参数 Trace跟踪参数 堆的分配参数 栈的分配参数 Trace跟踪参数 1.打开GC的日志,如果在程序的运行过程中,系统发生了GC,就会打印相关的信息. -verbose:gc -XX ...
- python学习笔记三--字典
一.字典: 1. 不是序列,是一种映射, 键 :值的映射关系. 2. 没有顺序和位置的概念,只是把值存到对应的键里面. 3. 通过健而不是通过偏移量来读取 4. 任意对象的无序集合 5. 可变长,异构 ...
- 关于rewriteRule的一个小问题
RewriteEngine on # RewriteRule ^test.php$ modrewrite.php# RewriteRule ^(.*) http://www.baidu.com [L] ...
- cf A. Inna and Pink Pony(思维题)
题目:http://codeforces.com/contest/374/problem/A 题意:求到达边界的最小步数.. 刚开始以为是 bfs,不过数据10^6太大了,肯定不是... 一个思维题, ...
- uva753 A Plug for UNIX
最大流. 流可以对应一种分配方式. 显然最大流就可以表示最多匹配数 #include<cstdio> #include<algorithm> #include<cstri ...