这道题目,我构思思路可是构思了好长时间....
主要是需要注意的点太多了,建树啊,查找啊什么的都好弄,就是,去字母的时候需要注意一些东西.比如,你遇到了标点就要停一下,,你遇到了空格回车也需要停一下,
反正是一定要考虑周全的.要不然出不了答案的.
贴出代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
struct T{
T *next[26];
int flag;
char trans[10];
}*root;
const int st='a';
void init(T *t)
{
memset(t->next,0,sizeof(t->next));
t->flag=0;
}
void Insert(char *eng,char *mars)
{
T *t,*newnode;
t=root;
int n=strlen(mars);
for(int i=0;i<n;i++)
{
if(t->next[mars[i]-st]==0)
{
newnode=new T;
init(newnode);
t->next[mars[i]-st]=newnode;
t=newnode;
}
else
{
t=t->next[mars[i]-st];
}
}
t->flag=1;
strcpy(t->trans,eng);
}
char * find(char *s)
{
T *t;
t=root;
int n=strlen(s);
for(int i=0;i<n;i++)
{
if(t->next[s[i]-st]==0)
return s;
else
{
t=t->next[s[i]-st];
}
}
if(t->flag==1)
return t->trans;
else
return s;
}
int main()
{
char t[10];
char eng[10],trans[10];
char *s;
char c;
char mars[10];
int m=0;
root=new T;
init(root);
scanf("%s",t);
if(strcmp(t,"START")==0)
{
while(scanf("%s",eng),strcmp(eng,"END"))
{
scanf("%s",trans);
Insert(eng,trans);
}
}
scanf("%s",t);
if(strcmp(t,"START")==0)
{
getchar();
while(c=getchar())
{
if('a'<=c&&c<='z'||'A'<=c&&c<='Z')
mars[m++]=c;
else if(c==' '||c=='\n')
{
mars[m]='\0';
if(strcmp(mars,"END")==0)
break;
s=find(mars);
printf("%s",s);
putchar(c);
m=0;
}
else
{
mars[m]='\0';
if(strcmp(mars,"END")==0)
break;
s=find(mars);
printf("%s",s);
putchar(c);
m=0;
}
}
}
return 0;
}