题目链接:实现Trie(前缀树)
请你实现 Trie 类:
- Trie() 初始化前缀树对象。
- void insert(String word) 向前缀树中插入字符串 word 。
- boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。
- boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。
class Trie {
public:
int t[100000][26], exist[100000], cnt = 0;
Trie() {
memset(t, 0, sizeof t);
memset(exist, 0, sizeof exist);
cnt = 0;
}
void insert(string word) {
int now = 0;
for (int i = 0; i < word.size(); i++) {
if (!t[now][word[i] - 'a']) t[now][word[i] - 'a'] = ++cnt;
now = t[now][word[i] - 'a'];
}
exist[now] = 1;
}
bool search(string word) {
int now = 0;
for (int i = 0; i < word.size(); i++) {
if (!t[now][word[i] - 'a']) return false;
now = t[now][word[i] - 'a'];
}
return exist[now];
}
bool startsWith(string prefix) {
int now = 0;
for (int i = 0; i < prefix.size(); i++) {
if (!t[now][prefix[i] - 'a']) return false;
now = t[now][prefix[i] - 'a'];
}
return true;
}
};
题目链接:实现 Trie (前缀树) II
实现前缀树 Trie 类:
- Trie() 初始化前缀树对象。
- void insert(String word) 将字符串 word 插入前缀树中。
- int countWordsEqualTo(String word) 返回前缀树中字符串 word 的实例个数。
- int countWordsStartingWith(String prefix) 返回前缀树中以 prefix 为前缀的字符串个数。
- void erase(String word) 从前缀树中移除字符串 word 。
在第一个版本中加两个数组,一个用于前缀计数,一个用于字符串本身计数即可
class Trie {
int t[100000][26], cnt = 0, cnt_pre[100000], cnt_word[100000];
public:
Trie() {
memset(t, 0, sizeof t);
memset(cnt_pre, 0, sizeof cnt_pre);
memset(cnt_word, 0, sizeof cnt_word);
cnt = 0;
}
void insert(string word) {
int now = 0;
for (int i = 0; i < word.size(); i++) {
if (!t[now][word[i] - 'a']) t[now][word[i] - 'a'] = ++cnt;
now = t[now][word[i] - 'a'];
cnt_pre[now]++;
}
cnt_word[now]++;
}
int countWordsEqualTo(string word) {
int now = 0;
for (int i = 0; i < word.size(); i++) {
if (!t[now][word[i] - 'a']) t[now][word[i] - 'a'] = ++cnt;
now = t[now][word[i] - 'a'];
}
return cnt_word[now];
}
int countWordsStartingWith(string word) {
int now = 0;
for (int i = 0; i < word.size(); i++) {
if (!t[now][word[i] - 'a']) t[now][word[i] - 'a'] = ++cnt;
now = t[now][word[i] - 'a'];
}
return cnt_pre[now];
}
void erase(string word) {
int now = 0;
for (int i = 0; i < word.size(); i++) {
if (!t[now][word[i] - 'a']) t[now][word[i] - 'a'] = ++cnt;
now = t[now][word[i] - 'a'];
cnt_pre[now]--;
}
cnt_word[now]--;
}
};