问题 C: 公共前缀
题目描述
输入一组单词,创建Trie树。输入字符串,计算以该字符串为公共前缀的单词数。
(提示:树结点有26个指针,指向单词的下一字母结点。)
输入
测试数据有多组,每组测试数据格式为:
第一行:一行单词,单词全小写字母,且单词不会重复,单词的长度不超过10
第二行:测试公共前缀字符串数量t
后跟t行,每行一个字符串
输出
每组测试数据输出格式为:
第一行:创建的Trie树的层次遍历结果
第2~t+1行:对每行字符串,输出树中以该字符串为公共前缀的单词数。
样例输入
abcd abd bcd efg hig
3
ab
bc
abcde
样例输出
abehbcficddggd
2
1
0
代码
#include <iostream>
#include <string>
#include <queue>
using namespace std;
class Node
{
public:
char data;
Node* next[26];
Node(){
data=0;
for(int i=0;i<26;i++)next[i]=NULL;
}
};
class Tree
{
private:
Node* head;
int sum;
public:
Tree(){
head=new Node();
}
void initial(){
string temp;
getline(cin,temp);
string word[20];
int k=0;
for(int i=0;i<temp.length();i++){
if(temp[i]!=' '){
word[k].append(1,temp[i]);
}else k++;
}
for(int i=0;i<=k;i++){
Node* p=head;
for(int j=0;j<word[i].length();j++){
if(!p->next[word[i][j]-'a']){
Node* temp1=new Node();
temp1->data=word[i][j];
p->next[word[i][j]-'a']=temp1;
p=p->next[word[i][j]-'a'];
}else p=p->next[word[i][j]-'a'];
}
}
}
Node* build(Node* p,string temp,int k)
{
if(k==temp.length()-1){
Node* t=new Node();
t->data=temp[k];
return t;
}
return p=build(p->next[temp[k]-'a'],temp,k+1);
}
void levelorder(){//层序遍历
queue<Node*> Q;
Node* temp=head;
Q.push(temp);
while(!Q.empty()){
Node* t1=Q.front();
if(t1->data!=0)cout << t1->data;
for(int i=0;i<26;i++)
if(t1->next[i])Q.push(t1->next[i]);
Q.pop();
}
cout << endl;
}
void judge()//得到个数
{
int n;
cin >> n;
while(n--){
sum=0;
string temp;
cin >> temp;
Node* p=find(temp);
get(p);
cout << sum << endl;
}
}
Node* find(string temp)
{
Node* p=head;
for(int i=0;i<temp.length();i++){
p=p->next[temp[i]-'a'];
}
return p;
}
void get(Node* p)
{
if(!p)sum=0;
else{
bool flag=false;
for(int i=0;i<26;i++){
if(p->next[i]){
flag=true;
get(p->next[i]);
}
}
if(!flag)sum++;
}
}
};
int main()
{
Tree task;
task.initial();
task.levelorder();
task.judge();
return 0;
}
小结
一个笔记