字典树模板-C++

仅供参考

	struct TrieNode {
    
    
		int pass = 0, end = 0;
		unordered_map<int, TrieNode*> nexts;
	};

	TrieNode* root = new TrieNode();

	// 增加单词
	void AddWord(string word) {
    
    
		int index = 0;
		TrieNode* p = root;
		p->pass++;
		for (char ch : word) {
    
    
			index = ch - 'a';
			if (p->nexts[index] == nullptr) {
    
    
				p->nexts[index] = new TrieNode();
			}
			p = p->nexts[index];
			p->pass++;
		}
		p->end++;
	}

	// 删除单词
	void DeleteWord(string word) {
    
    
		if (SearchWord(word) == 0)  return;
		TrieNode* p = root;
		p->pass--;
		int index = 0;
		for (char ch : word) {
    
    
			index = ch - 'a';
			--p->nexts[index]->pass;
			p = p->nexts[index];
		}
		p = root;

		for (char ch : word) {
    
    
			index = ch - 'a';
			// 删除了p->nexts[index],但是p->nexts[index]
			if (p->nexts[index]->pass == 0)
				delete p->nexts[index];

			p = p->nexts[index];
		}
	}

	// 查询单词完整出现的次数
	int SearchWord(string word) {
    
    
		int index = 0;
		TrieNode* p = root;
		for (char ch : word) {
    
    
			index = ch - 'a';

			if (p->nexts[index] == nullptr) {
    
    
				return 0;
			}
			p = p->nexts[index];
		}
		return p->end;
	}

	// 返回以字符串word作为前缀的单词数量
	int PrefixNumber(string word) {
    
    
		TrieNode* p = root;
		int index = 0, num = 0;
		for (char ch : word) {
    
    
			index = ch - 'a';
			// 此时没有 没比完word之前,没出现直接return
			if (p->nexts[index] == nullptr) {
    
    
				return 0;
			}
			p = p->nexts[index];
		}
		return p->pass;
	}

猜你喜欢

转载自blog.csdn.net/lr_shadow/article/details/115268303