题解:
class Solution {
public:
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
int m = 0;
int n = 0;
vector<string> result;
unordered_set<string> wordsets;
void dfs(int i,int j,vector<vector<char>>& board,string& s,vector<vector<bool>>& vis){
if(s.length()>10){
return;
}
if(wordsets.find(s)!=wordsets.end()){
//存在
result.push_back(s);
//从set中去除
wordsets.erase(s);
}
//从四个方向深搜
for(int k = 0;k<4;k++){
int x = i+dx[k];
int y = j+dy[k];
if(x<0 ||x>=m ||y<0 ||y>=n){
continue;
}
//如果搜过 跳过
if(vis[x][y]){
continue;
}
if(s.size()>=10){
break;
}
//否则 加入s
s.push_back(board[x][y]);
vis[x][y] = true;
//深搜
dfs(x,y,board,s,vis);
//回溯
vis[x][y] = false;
s.pop_back();
}
}
vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
m = board.size();
n = board[0].size();
vector<vector<bool>> vis(m,vector<bool>(n,false));
for(string str:words){
wordsets.insert(str);
}
//挨个从某点深搜
for(int i =0;i<m;i++){
for(int j = 0;j<n;j++){
string word;
vis[i][j] = true;
word.push_back(board[i][j]);
//深搜
dfs(i,j,board,word,vis);
//回溯
vis[i][j] = false;
}
}
return result;
}
};