#define MAX 26
struct Node
{
bool isTail;
char ch;
Node* next[MAX];
Node():isTail(false), ch(' ')
{
for(int i = 0; i < MAX; ++i)
next[i] = NULL;
}
Node(char ch_in):isTail(false), ch(ch_in)
{
for(int i = 0; i < MAX; ++i)
next[i] = NULL;
}
};
Node *ROOT = new Node(' ');
void insert(const string &str)
{
Node *ptr = ROOT;
for(int i = 0; i < str.size(); ++i)
{
int idx = str[i] - 'a';
if(NULL == ptr->next[idx])
ptr->next[idx] = new Node(str[i]);
ptr = ptr->next[idx];
}
ptr->isTail = true;
}
void buildTree(vector<string> &words)
{
for(int i = 0; i < words.size(); ++i)
insert(words[i]);
}
void search(vector<vector<char> > &board, vector<vector<bool> > &used, int i, int j, vector<string> &ret,
string res, Node *ptr)
{
if(NULL == ptr)
return ;
if(ptr->isTail)
{
ret.push_back(res);
}
if(i < board.size() || j < board[0].size() || i >= board.size() || j >= board[0].size())
return;
if(!used[i][j] && NULL != ptr->next[board[i][j] - 'a'])
{
ptr = ptr->next[board[i][j] - 'a'];
used[i][j] = true;
res.push_back(board[i][j]);
search(board, used, i+1, j, ret, res, ptr);
search(board, used, i-1, j, ret, res, ptr);
search(board, used, i, j-1, ret, res, ptr);
search(board, used, i, j+1, ret, res, ptr);
used[i][j] = false;
res.erase(res.end()-1);
}
}
vector<string> search(vector<vector<char> > &board, vector<string> &words)
{
buildTree(words);
int m = board.size(), n = board.size() > 0? board[0].size(): 0;
vector<vector<bool> > used(m, vector<bool>(n));
vector<string> ret;
for(int i = 0; i < m; ++i)
for(int j = 0; j < n; ++j)
search(board, used, i, j, ret, string(""), ROOT);
return ret;
}
一个词典,一个字符矩阵,找出那些在字符举证中出现的单词
最新推荐文章于 2023-01-11 20:10:04 发布