题意:先构造一个词典,然后输入外文单词,输出相应的英语单词。
这道题有4种方法可以做:
1.map
2.字典树
3.快排+二分
4.hash表
参考博客:POJ2503两种解法:快速排序+二分查找与哈希表
思路1:可以使用map来做
代码:
#include<iostream> #include<stdio.h> #include<string> #include<map> using namespace std; map<string,bool>appear;//记录单词的存在 map<string,string>translate;//记录单词的翻译 int main(){ char s[40]; char english[20]; char foreign[20]; while(gets(s) && s[0]){ sscanf(s,"%s%s",english,foreign); appear[foreign]=true; translate[foreign]=english; } while(scanf("%s",s)!=EOF){//vc6.0中需要按两下ctrl+z才能结束循环 if(appear[s]) cout<<translate[s]<<endl;//string 不能用printf输出 else printf("eh "); } return 0; }
vc6.0中需要按两下ctrl+z才能结束循环?详见:EOF的使用
思路2:用字典树来做
代码:
#include<iostream> #include<cstring> #include<stdio.h> using namespace std; const int MAX=26; struct Trie { Trie *next[MAX]; int v; //根据需要变化,1代表无此单词,-1代表有此单词 char english[20]; }; Trie *root=new Trie; char s[40]; char english[20]; char foreign[20]; char out[20];//存储要输出的内容 void createTrie(char *str){ int len = strlen(str); Trie *p = root, *q; for(int i=0; i<len; ++i){ int id = str[i]-'a'; if(p->next[id] == NULL){ // q = (Trie *)malloc(sizeof(Trie)); q = new Trie; q->v = 1; //初始v==1 for(int j=0; j<MAX; ++j) q->next[j] = NULL; p->next[id] = q; } p = p->next[id]; } p->v = -1; //若为结尾,则将v改成-1表示 strcpy(p->english,english); } int findTrie(char *str){ int len = strlen(str); Trie *p = root; for(int i=0; i<len; ++i){ int id = str[i]-'a'; p = p->next[id]; if(p == NULL) //若为空集,表示不存以此为前缀的串 return 0; } if(p->v == -1){ strcpy(out,p->english); return 1; //存在单词 } return 0; } int main(){ int i; for(i=0;i<MAX;i++) root->next[i]=NULL; while(gets(s) && s[0]){ sscanf(s,"%s%s",english,foreign); createTrie(foreign); } while(scanf("%s",s)!=EOF){//vc6.0中需要按两下ctrl+z才能结束循环 if(findTrie(s)==1) printf("%s ",out); else printf("eh "); } return 0; }
思路3:快排+二分
代码:
思路4:hash表
代码: