1.字典树和DFS遍历的结合。
对给的表中任意一点进行DFS遍历,通过遍历过程中参数中的字典树的节点来决定遍历情况。
struct node{
bool word;
string str;
unordered_map<char,node*> words;
node(){
word=false;
string str="";
}
};
class Tree{
private:
node* root;
public:
Tree(){
root=new node();
}
void insert(string word){
node*p=root;
for(char c:word){
if(!p->words.count(c)){
node*t=new node;
p->words[c]=t;
}
p=p->words[c];
}
p->word=true;
p->str=word;
}
void searc(vector<string>&ans,vector<vector<char>>& board){
for(int i=0;i<board.size();i++){
for(int j=0;j<board[0].size();j++){
help(ans,board,root,i,j);
}
}
}
void help(vector<string>& ans,vector<vector<char>>& board,node* p,int i,int j){
if(p->word){
p->word=false;
ans.push_back(p->str);
return;
}
if(i<0||i==board.size()||j<0||j==board[0].size()) return;
char cur=board[i][j];
if(p->words.count(cur)==0) return;
p=p->words[cur];
board[i][j]='#';
help(ans, board, p, i+1, j);
help(ans, board, p, i-1, j);
help(ans, board, p, i, j+1);
help(ans, board, p, i, j-1);
board[i][j] = cur;
}
};
class Solution {
public:
vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
Tree tmp;
for(auto x:words){
tmp.insert(x);
}
vector<string> ans;
tmp.searc(ans,board);
return ans;
}
};