题目描述
思路分析
Trie+DFS
单纯暴搜每个单词会TLE
代码实现
class Solution {
public:
struct Node{
int id;
Node* son[26];
Node(){
id=-1;
for(int i=0;i<26;i++) son[i]=0;
}
}*root;
vector<vector<char>> board;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
void insert(string &s,int id){
auto p=root;
for(auto c:s){
int t=c-'a';
if(!p->son[t]) p->son[t]=new Node();
p=p->son[t];
}
p->id=id;
}
unordered_set<int> ids;
vector<string> findWords(vector<vector<char>>& _board, vector<string>& words) {
board=_board;
root=new Node();
for(int i=0;i<words.size();i++) insert(words[i],i);
for(int i=0;i<board.size();i++){
for(int j=0;j<board[0].size();j++){
int u=board[i][j]-'a';
if(root->son[u]){
dfs(i,j,root->son[u]);
}
}
}
vector<string> ans;
for(auto id:ids) ans.push_back(words[id]);
return ans;
}
void dfs(int x,int y,Node* p){
if(p->id!=-1) ids.insert(p->id);
char t=board[x][y];
board[x][y]='.';
for(int i=0;i<4;i++){
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0&&nx<board.size()&&ny>=0&&ny<board[0].size()&&board[nx][ny]!='.'){
int u=board[nx][ny]-'a';
if(p->son[u]) dfs(nx,ny,p->son[u]);
}
}
board[x][y]=t;
}
};