LeetCode——208. Implement Trie (Prefix Tree)

Description

Implement a trie with insert, search, and startsWith methods.

Example

Trie trie = new Trie();

trie.insert("apple");
trie.search("apple");   // returns true
trie.search("app");     // returns false
trie.startsWith("app"); // returns true
trie.insert("app");   
trie.search("app");     // returns true

Note

  • You may assume that all inputs are consist of lowercase letters a-z.
  • All inputs are guaranteed to be non-empty strings.

Solution 1(C++)

class TrieNode{
public:
	staic const int NODE_SIZE = 26;
	TrieNode* child[NODE_SIZE];
	bool isExist;

	TrieNode(){
		for(int i=0; i<NODE_SIZE; i++){
			child[i] = NULL;
		}
		isExist = false;
	}

	TrieNode(char c){
		for(int i=0; i<NODE_SIZE; i++){
			if(c-'a' == i) child[i] = new TrieNode();
		}
		isExist = false;
	}
};

class Trie{
public:
	Trie(){
		root = new TrieNode();
		root->isExist = true;
	}
	
	~Trie(){
		Destory(node);
	}
	
	void insert(string word){
		TrieNode* temp = root;
		for(int i=0; i<word.size(); i++){
			if(temp->child[word[i]-'a'] == NULL){
				temp->child[word[i]-'a'] = new TrieNode();
			}
			temp = temp->child[word[i]-'a'];
		}
		temp->isExist = true;
	}

	bool search(string word){
		if(word == "") return true;
		TrieNode* temp = root;
		for(int i=0; i<word.size(); i++){
			if(temp->child[word[i]-'a'] == NULL) return false;
			temp = temp->child[word[i]-'a'];
		}
		return temp != NULL && temp->isExist == true;
	}

	bool startsWith(string prefix){
		if(prefix == "") return true;
		TrieNode* temp = root;
		for(int i=0; i<prefix.size(); i++){
			if(temp->child[prefix[i]-'a'] == NULL) return false;
			temp = temp->child[prefix[i]-'a'];
		}
		return temp != NULL;
	}
	
	void Destory(TreeNode* node)}{
		for(int i=0; i<NODE_SIZE; I++){
			if(node->child[i] == NULL) Destory(node->child[i]);
		}
	}

private:
	TrieNode* root;
};

算法分析

这道题考察的是字典树。弄明白字典树的基本含义,这道题目就不难。

程序分析

注意,虽然对解题没有什么帮助,但是还要注意,析构函数与内存的释放。养成一个好习惯,毕竟用了C++。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值