
方法一: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; } };
