题目:
题解:
cpp
class Solution {
public:
struct Node{
int id;
Node* son[26];
Node(){
id = -1;
for(int i = 0; i < 26; i++) son[i] = NULL;
}
}* root;
vector<vector<char>> g;
unordered_set<int> ids;
vector<string> res;
int dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1};
vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
g = board;
root = new Node();
for(int i = 0; i < words.size(); i++) {
string wd = words[i];
auto p = root;
for(auto c: wd){
int i = c - 'a';
if(!p->son[i]) p->son[i] = new Node();
p = p->son[i];
}
p->id = i;
}
for(int i = 0; i < board.size(); i++)
for(int j = 0; j < board[0].size(); j++){
int u = g[i][j] - 'a';
if(root->son[u]) {
dfs(i, j, root->son[u]);
}
}
for(auto id: ids) res.push_back(words[id]);
return res;
}
void dfs(int x, int y, Node* root){
if(root->id != -1) ids.insert(root->id);
int c = g[x][y];
g[x][y] = '.';
for(int i = 0; i < 4; i++){
int a = x + dx[i], b = y + dy[i];
if(a < 0 || a >= g.size() || b < 0 || b >= g[0].size() || g[a][b] == '.' ) continue;
int u = g[a][b] - 'a';
if(root->son[u]) dfs(a, b, root->son[u]);
}
g[x][y] = c;
}
};