一个词典,一个字符矩阵,找出那些在字符举证中出现的单词

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值