LeetCode-208. 实现 Trie (前缀树)

实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。

示例:

Trie trie = new Trie();

trie.insert("apple");
trie.search("apple");   // 返回 true
trie.search("app");     // 返回 false
trie.startsWith("app"); // 返回 true
trie.insert("app");   
trie.search("app");     // 返回 true
说明:

你可以假设所有的输入都是由小写字母 a-z 构成的。
保证所有输入均为非空字符串。

学习字典树。

#include <iostream>
#include <stdlib.h>
using namespace std;

class Trie {
private:
	bool isEnd;
	Trie* next[26];

public:
	/** Initialize your data structure here. */
	Trie() {
		isEnd = false;
		memset(next, 0x00, sizeof(next));
	}

	/** Inserts a word into the trie. */
	void insert(string word) {
		Trie* node = this;
		for (char c : word) {
			if (node->next[c - 'a'] == NULL) {
				node->next[c - 'a'] = new Trie();
			}
			node = node->next[c - 'a'];
		}
		node->isEnd = true;
	}

	/** Returns if the word is in the trie. */
	bool search(string word) {
		Trie* node = this;
		for (char c : word) {
			if (node->next[c - 'a'] == NULL) {
				return false;
			}
			node = node->next[c - 'a'];
		}
		return node->isEnd;
	}

	/** Returns if there is any word in the trie that starts with the given prefix. */
	bool startsWith(string prefix) {
		Trie* node = this;
		for (char c : prefix) {
			if (node->next[c - 'a'] == NULL) {
				return false;
			}
			node = node->next[c - 'a'];
		}
		return true;
	}
};

int main() {

	Trie* obj = new Trie();
	obj->insert("hello world jdkfjkal");
	obj->insert("witcher");
	cout << obj->search("hello world jdkfjkal") << endl;
	cout << obj->startsWith("witcher") << endl;
	cout << obj->startsWith("wit") << endl;

	system("pause");
	return 0;
}
发布了245 篇原创文章 · 获赞 57 · 访问量 36万+

猜你喜欢

转载自blog.csdn.net/qq_16542775/article/details/103734480
今日推荐