leetcode 212 单词搜索II
方法一:C++ dfs+string to int的哈希表
方法二:使用Trie树
一个别人家的java代码,依赖于Trie树题目中的Trie class 实现;
python 版:不用新建Trie class:
个人根据java版写的c++:
//Trie树的节点,也可以用结构体 class TrieNode{ public: TrieNode *child[26]; bool isend=false; TrieNode(){ for(auto &c:child){ c=NULL; } } }; //Trie树的类定义 class Trie{ public: TrieNode *root; Trie(){ root=new TrieNode(); } void insert(string word){ TrieNode *p=root; for(auto w:word){ int i=w-'a'; if(p->child[i]==NULL) p->child[i]=new TrieNode(); p=p->child[i]; } p->isend=true; } bool search(string str){ TrieNode *p=root; for(auto s:str){ int i=s-'a'; if(p->child[i]==NULL) return false; p=p->child[i]; } return p->isend; } bool presubstr(string str){ TrieNode *p=root; for(auto s:str){ int i=s-'a'; if(p->child[i]==NULL) return false; p=p->child[i]; } return true; } }; class Solution { public: int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; set<string> ss; Trie trie;//定义一个Trie树对象; vector<string> findWords(vector<vector<char>>& board, vector<string>& words) { //method1:先获取最长word的长度,建立word2int的哈希表,然后通过循环dfs或bfs来搜索; //method2:Trie树 vector<string> vs; int m=board.size(); if(m==0) return vs; int n=board[0].size(); if(n==0) return {""}; //定义是否访问过 vector<vector<int> > visited(m,vector(n,0)); //建立words字典树 for(auto w:words){ trie.insert(w); } for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ dfs(board,i,j,"",visited); } } for(auto s:ss){ vs.push_back(s); } return vs; } void dfs(vector<vector<char>> & board,int x,int y,string str,vector<vector<int> >&visited){ int m=board.size(),n=board[0].size(); if(x<0 || x>=m ||y<0 ||y>=n || visited[x][y]) return; str.push_back(board[x][y]); if(!trie.presubstr(str)) return;//回溯条件,如果字典树中不存在以str为前缀的单词,那么没必要再遍历了; if(trie.search(str)) ss.insert(str); visited[x][y]=1; for(int i=0;i<4;i++){ dfs(board,x+dx[i],y+dy[i],str,visited); } visited[x][y]=0; } };