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的更多相关文章

  1. 字典树(查找树) leetcode 208. Implement Trie (Prefix Tree) 、211. Add and Search Word - Data structure design

    字典树(查找树) 26个分支作用:检测字符串是否在这个字典里面插入.查找 字典树与哈希表的对比:时间复杂度:以字符来看:O(N).O(N) 以字符串来看:O(1).O(1)空间复杂度:字典树远远小于哈 ...

  2. leetcode 211. Add and Search Word - Data structure design Trie树

    题目链接 写一个数据结构, 支持两种操作. 加入一个字符串, 查找一个字符串是否存在.查找的时候, '.'可以代表任意一个字符. 显然是Trie树, 添加就是正常的添加, 查找的时候只要dfs查找就可 ...

  3. leetcode 79. Word Search 、212. Word Search II

    https://www.cnblogs.com/grandyang/p/4332313.html 在一个矩阵中能不能找到string的一条路径 这个题使用的是dfs.但这个题与number of is ...

  4. LeetCode 79 Word Search(单词查找)

    题目链接:https://leetcode.com/problems/word-search/#/description 给出一个二维字符表,并给出一个String类型的单词,查找该单词是否出现在该二 ...

  5. [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 ...

  6. [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 ...

  7. [leetcode]79.Search Word 回溯法

    /** * Given a 2D board and a word, find if the word exists in the grid. The word can be constructed ...

  8. [LeetCode] Add and Search Word - Data structure design 添加和查找单词-数据结构设计

    Design a data structure that supports the following two operations: void addWord(word) bool search(w ...

  9. leetcode@ [211] Add and Search Word - Data structure design

    https://leetcode.com/problems/add-and-search-word-data-structure-design/ 本题是在Trie树进行dfs+backtracking ...

随机推荐

  1. hdu 2897 邂逅明下 博弈论

    这个分区间: 1<=n%(p+q)<=p 必败 其他必胜! 代码如下: #include<iostream> #include<stdio.h> #include& ...

  2. Java 垃圾回收机制

    1.delete是C++里面用于释放内存的运算符,而不是Java. 2.当发现某个对象的引用计数为0时,就将对象列入待回收列表中,并不是马上予以销毁. 3.System.gc()仅仅是一个回收请求,J ...

  3. MetadataType的使用

    MetadataType的使用,MVC的Model层数据验证指定要与数据模型类关联的元数据类 using System.ComponentModel.DataAnnotations; //指定要与数据 ...

  4. http://blog.csdn.net/xyang81/article/details/7292380

    http://blog.csdn.net/xyang81/article/details/7292380

  5. Qt: 绘图基础(非常简洁明了,全面)

    QPainter 能绘制: point, line, rectangle, ellipse, arc, chord, polygon, pie segment, Bezier curve, QPixm ...

  6. 常用JVM配置参数

    常用JVM配置参数 Trace跟踪参数 堆的分配参数 栈的分配参数 Trace跟踪参数 1.打开GC的日志,如果在程序的运行过程中,系统发生了GC,就会打印相关的信息. -verbose:gc -XX ...

  7. python学习笔记三--字典

    一.字典: 1. 不是序列,是一种映射, 键 :值的映射关系. 2. 没有顺序和位置的概念,只是把值存到对应的键里面. 3. 通过健而不是通过偏移量来读取 4. 任意对象的无序集合 5. 可变长,异构 ...

  8. 关于rewriteRule的一个小问题

    RewriteEngine on # RewriteRule ^test.php$ modrewrite.php# RewriteRule ^(.*) http://www.baidu.com [L] ...

  9. cf A. Inna and Pink Pony(思维题)

    题目:http://codeforces.com/contest/374/problem/A 题意:求到达边界的最小步数.. 刚开始以为是 bfs,不过数据10^6太大了,肯定不是... 一个思维题, ...

  10. uva753 A Plug for UNIX

    最大流. 流可以对应一种分配方式. 显然最大流就可以表示最多匹配数 #include<cstdio> #include<algorithm> #include<cstri ...