LeetCode Implement Trie (Prefix Tree)

LeetCode Implement Trie (Prefix Tree)

Implement a trie with insertsearch, and startsWith methods.

Note:
You may assume that all inputs are consist of lowercase letters a-z.


题目要求是实现字典树(前缀树)。

class TrieNode {
public:
	// Initialize your data structure here.
	TrieNode() 
	{
		memset(branch, 0, sizeof(branch));
		isWord = false;
	}

	TrieNode* branch[26];//记录26个小写字母的分支
	bool isWord;//判断某个分支节点是不是单词(比如插入abcd,只有abcd是单词,而abc只是前缀,不是单词;用于辅助search方法)
};

class Trie {
public:
	Trie() 
	{
		root = new TrieNode();
	}

	// Inserts a word into the trie.
	void insert(string s) 
	{
		if (s.length() == 0 || root == NULL)
			return;

		TrieNode* p = root;
		for (int i = 0; i < s.length(); i++)
		{
			if (p->branch[s[i] - 'a'] == NULL)
			{
				p->branch[s[i] - 'a'] = new TrieNode();
			}
			
			p = p->branch[s[i] - 'a'];
		}
		//插入“是单词”的标记
		p->isWord = true;
	}

	// Returns if the word is in the trie.
	bool search(string key) 
	{
		if (key.length() == 0 || root == NULL)
			return false;

		TrieNode* p = root;
		int i = 0;
		for (; i < key.length() && p!=NULL; i++)
		{
			p = p->branch[key[i] - 'a'];
		}
		//遍历到该节点,且该节点做个“是单词”的标记
		if (p != NULL && p->isWord == true)
			return true;
		return false;
	}

	// Returns if there is any word in the trie
	// that starts with the given prefix.
	bool startsWith(string prefix) 
	{
		if (prefix.length() == 0 || root == NULL)
			return false;

		TrieNode* p = root;
		int i;
		for (i = 0; i < prefix.length() && p != NULL; i++)
		{
			p = p->branch[prefix[i] - 'a'];
		}

		if (p != NULL)
			return true;
		return false;
	}

private:
	TrieNode* root;
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值