START from fiwo hello difh mars riwosf earth fnnvk like fiiwj END START difh, i'm fiwo riwosf. i fiiwj fnnvk! END
hello, i'm from mars. i like earth! --------------------------------------------------------------------------#include<stdio.h> #include<ctype.h> #include<malloc.h> #include<cstring> #define maxn1 20 #define maxn2 3010 typedef struct node { char word[maxn1]; node *next[26]; }Trie; Trie root;//定义了一个结构体变量,作为头结点 void createTrie(char word1[],char word2[]) { Trie *p,*q; int id; q = &root; int len = strlen(word2); for(int i=0;i<len;i++) { id = word2[i] - 'a'; if(q->next[id]==NULL) { p = (Trie*)malloc(sizeof(Trie)); p->word[0]='\0';//这里至关重要 (1) for(int i=0;i<26;i++) p->next[i] = NULL; q->next[id] = p; //q = q->next[id]; } q = q->next[id]; } strcpy(q->word,word1);//q最后指向最后一个节点(即叶节点,同时将对应英文单词存到这里) } void search(char word[]) { int flag=1,i; Trie *q=&root;// 记得将q指向头结点,刚开始忘了 int len = strlen(word); for(i=0;i<len;i++) { int id = word[i] - 'a'; if(q->next[id]!=NULL)//不等于空的情况下指向下一个节点 q = q->next[id]; else { flag = 0;break; }// 跳出 } if(flag && strlen(q->word))//找到了对应的英文 (2) printf("%s",q->word); else //没有找到对应的英文,则原样输出该单词 printf("%s",word); } int main() { char str1[maxn2]; char str2[maxn2]; int i,j; scanf("%s",str1); while(scanf("%s",str1),strcmp(str1,"END")) { scanf("%s",str2); createTrie(str1,str2); } scanf("%s",str1); getchar(); while(gets(str1),strcmp(str1,"END")) { int len = strlen(str1); for(i=0;i<len;i++) { if(islower(str1[i]))//判断是否是小写字母 { int k =0; for(j=i;str1[j]&&islower(str1[j]);j++)//读入一个单词,不是小写字母时退出 str2[k++] = str1[j]; str2[k]='\0'; search(str2); i = j - 1;//调整指针 } else printf("%c",str1[i]);//不是小写字母时,直接输出,这里是处理字符,空格 } printf("\n"); } //while(1); return 0;
}
/* START from fiwo hello difh trap dif mars riwosf earth fnnvk like fiiwj END START difh, i'm fiwo riwosf. i fiiwj fnnvk! dif fnn END
*/
分析这组数据:
在建立字典树的时候,每分配一个节点,都要将该节点的word数组清零或者长度为0(word[0]='\0';可以完成);
要不然,在翻译时,当某个火星文字,是字典中一个火星文字的前缀时,需要判断该节点的word数组是否为空(为空说明,字典中没有此单词),如果为空就不能输出,应该将该单词原样输出;程序中(1)(2)两处正是完成这样的判断