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 ...
随机推荐
- uva 108
降维 枚举行累加 然后求单行上最大连续和 #include <iostream> #include <cstring> #include <cstdio> # ...
- python调试总结
调试通常采用两种方式,打印日志调试以及运行时实时跟踪调试. 一.打印日志: 1. print不要看不起print,这是一切调试的起点,即便是调试Java或者C这种巨麻烦的编译语言,print仍然是常用 ...
- 强大的CImage类
这下有了CImage类,处理其他类型的图片不再寻找第三方类库了.加载到对话框背景的代码如下: //从资源里载入背景JPEG图片 HRSRC hRsrc=::FindResource(AfxGetRe ...
- 【leetcode】Word Break (middle)
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...
- ORACLE 更新关联多张表
UPDATE T_XMLC_BILL_HEAD_BAK T1 SET (T1.SENDRECEIVEFLAG, T1.SENDRECEIVEOPERATOR, T1.SENDRECEIVEDATE, ...
- spring事物的传播行为
1.spring事物的传播行为,主要是用来解决业务层拥有事物的方法,相互调用的问题. 2.声明事物, 在代码执行前,开启事务.代码执行完,提交事务 3.spring并没有提供事务具体的处理,而只是调用 ...
- Servlet课程0425(六) 不经过验证直接跳转---session实现不同页面之间共享数据
在地址栏直接输入http://localhost:8080/myWebSite/wel 会发现页面也能跳转,只不过用户名和密码都为空,这是不可以的,因为没有经过验证非法登录了 Welcome,hell ...
- 选择排序的openMP实现
// test.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdio.h> #include < ...
- 解读Q_GLOBAL_STATIC(QFontDatabasePrivate, privateDb)
根据 src/corelib/global.h template <typename T>class QGlobalStatic{public: T *pointer; inline QG ...
- 算法总结之欧拉函数&中国剩余定理
算法总结之欧拉函数&中国剩余定理 1.欧拉函数 概念:在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目. 通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)( ...