题目地址:点击打开链接
前缀树缓存词组,然后用DFS搜索
class Solution {
public:
Solution():root(new TrieNode()){}
vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
vs.clear();
m=board.size();
if(m==0)return vs;
n=board[0].size();
if(n==0)return vs;
for(int i=0;i<words.size();++i)insert(words[i]);
visited=vector<vector<bool>>(m,vector<bool>(n,false));
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
if(root->children[board[i][j]-'a']!=NULL){
dfs(board,i,j,string()+board[i][j],root->children[board[i][j]-'a']);
}
}
}
return vs;
}
private:
//Trie
struct TrieNode{
bool isLeaf;
TrieNode* children[26];
TrieNode():isLeaf(false){
for(int i=0;i<26;++i)children[i]=NULL;
}
};
TrieNode *root;
void insert(string word){
TrieNode *p=root;
for(int i=0;i<word.size();++i){
if(p->children[word[i]-'a']==NULL){
p->children[word[i]-'a']=new TrieNode();
}
p=p->children[word[i]-'a'];
}
p->isLeaf=true;
}
//board dfs
int m,n;
vector<string> vs;
vector<vector<bool>> visited;
void dfs(vector<vector<char>>& board,int a,int b,string str,TrieNode *rt) {
visited[a][b]=true;
if(rt->isLeaf){
vs.push_back(str);
rt->isLeaf=false;
}
int mm[4][2]={-1,0,1,0,0,1,0,-1};
for(int i=0;i<4;++i){
int x=mm[i][0]+a;
int y=mm[i][1]+b;
if(x>=0&&x<m&&y>=0&&y<n&&!visited[x][y]&&rt->children[board[x][y]-'a']!=NULL){
dfs(board,x,y,str+board[x][y],rt->children[board[x][y]-'a']);
}
}
visited[a][b]=false;
}
};