hihocoder的题就有这个,这里主要写了创建与查找,查找用了两种方式,迭代与递归
#include<iostream>
#include<string>
using namespace std;
typedef struct trieTree
{
char word = 0;
int counts = 0;
struct trieTree* children[26] = {0}; //26个小写字母
}Trie;
Trie *root = new Trie;
void insertTree(string str,Trie *&root,int index = 0)
{
if(index == str.length())
{
return;
}
int k = str[index] - 'a'; //字母映射成数字
if(!root->children[k])
{
root->children[k] = new Trie;
}
root->children[k]->word = str[index];
root->children[k]->counts++;
insertTree(str, root->children[k], index + 1);
}
int search(string str, Trie* root)
{
int i = 0;
while(root && i < str.length())
{
int k = str[i] - 'a';
root = root->children[k];
i++;
}
if(i == str.length() && root)
{
return root->counts;
}
else
{
return 0;
}
}
void search(string str, Trie* root, int &count, int index = 0)
{
if (index < str.length())
{
int k = str[index] - 'a';
if (!root->children[k])
{
count = 0;
}
else
{
count = root->children[k]->counts;
search(str, root->children[k], count, index + 1);
}
}
}
int main()
{
int n = 0, m = 0;
cin >> n;
for(int i = 0; i < n; i++)
{
string str;
cin >> str;
insertTree(str, root);
}
cin >> m;
for(int i = 0; i < m; i++)
{
string str;
cin >> str;
int count = 0;
search(str, root,count);
cout << count << endl;
}
}