剛學的字典樹,代碼寫得很不熟練。寫法上也沒有什麼特別的優化,就是以1A為第一目標! 可惜還是失敗了。 少考慮了一種情況,就是一個單詞是另一個單詞前綴的問題,寫了好久,還是沒有1A。不過感覺對字典樹有了更深刻的理解。 代碼寫得不好,看看別人都是怎麼寫字典樹的去。
#include<stdio.h> #include<string.h> #include<malloc.h> struct node { node *a[27]; char s[15]; }; char s1[15],s2[15]; char s[3005],ss[15]; int k; node *root; void InsertTree() { node *cur; node *s; int i,ln; ln=strlen(s2); cur=root; for(i=0;i<ln;i++) { if(i==ln-1) { if(cur->a[s2[i]-'a']!=NULL) { strcpy(cur->a[s2[i]-'a']->s,s1); return ; } else { s=(node *)malloc(sizeof(node)); memset(s->a,0,sizeof(s->a)); s->s[0]='\0'; cur->a[s2[i]-'a']=s; strcpy(s->s,s1); } } else if(cur->a[s2[i]-'a']!=NULL) cur=cur->a[s2[i]-'a']; else { s=(node *)malloc(sizeof(node)); memset(s->a,0,sizeof(s->a)); s->s[0]='\0'; cur->a[s2[i]-'a']=s; cur=s; } } return ; } int FindTree() { int i,ln; node *cur; cur=root; ln=strlen(ss); for(i=0;i<ln;i++) { if(i==ln-1) { if(cur->a[ss[i]-'a']!=NULL&&cur->a[ss[i]-'a']->s[0]!='\0') { printf("%s",cur->a[ss[i]-'a']->s); return 1; } else return 0; } else { if(cur->a[ss[i]-'a']!=NULL) cur=cur->a[ss[i]-'a']; else return 0; } } return 0; } int main() { root=(node *)malloc(sizeof(node)); memset(root->a,0,sizeof(root->a)); while(scanf("%s",s1)) { if(strcmp(s1,"START")==0) continue; else if(strcmp(s1,"END")==0) break; scanf("%s",s2); InsertTree(); } getchar(); while(gets(s)) { if(strcmp(s,"START")==0) continue; else if(strcmp(s,"END")==0) break; int i; k=0; for(i=0;s[i]!='\0';i++) { if(s[i]>='a'&&s[i]<='z') { ss[k++]=s[i]; continue; } else if(k!=0) { ss[k]='\0'; if(!FindTree()) printf("%s",ss); memset(ss,0,sizeof(ss)); k=0; } printf("%c",s[i]); } if(k!=0) { ss[k]='\0'; if(!FindTree()) printf("%s",ss); } printf("\n"); } return 0; }