题目链接:https://leetcode-cn.com/problems/word-search-ii/
题目如下:
class Solution {
public:
struct Node{
Node* son[26];
int id;
Node(){
for(int i=0;i<26;i++) son[i]=nullptr;
id=-1;
}
};
Node* root=new Node();
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
vector<vector<char>> grap;
unordered_set<int> ids;
vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
grap=board;
for(int i=0;i<words.size();i++) insert(words[i],i);
for(int i=0;i<grap.size();i++){
for(int j=0;j<grap[i].size();j++){
if(root->son[grap[i][j]-'a']) dfs(i,j,root->son[grap[i][j]-'a']);
}
}
vector<string> res;
for(auto e:ids) res.push_back(words[e]);
return res;
}
void dfs(int x,int y,Node* p){
if(p->id!=-1) ids.insert(p->id);
char temp=grap[x][y];
grap[x][y]='.';//回溯1
//操作
for(int i=0;i<4;i++){
int a=x+dx[i],b=y+dy[i];
if(a>=0&&a<grap.size()&&b>=0&&b<grap[0].size()&&grap[a][b]!='.'){
if(p->son[grap[a][b]-'a']) dfs(a,b,p->son[grap[a][b]-'a']);
}
}
grap[x][y]=temp;//回溯2
}
void insert(string& word,int id){
auto p=root;
for(auto e:word){
if(!p->son[e-'a']) p->son[e-'a']=new Node();
p=p->son[e-'a'];
}
p->id=id;
}
};