题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=163
如:给出三组phone numbers,
- Emergency 911
- Alice 97 625 999
- Bob 91 12 54 26
判断较短的phone number是否是这组numbers中的一条或多条的前缀。也是判断一组字符串中,是否存在某一字符串是其它字符串的前缀。这里较为简便的方法是采用"字典树"(Trie)了,那何为"字典树“呢?
关于字典树的详细讲解在http://blog.csdn.net/cyongxue/article/details/19603401中可以看到。
理解了字典树,这里可以直接写出代码了:
int Insert(char *str) { bool flag = false; int length = strlen(str); Trie *p = root; for(int i = 0;i<length;i++) { int id = str[i] - '0'; p = p->next[id]; if(p == NULL) { flag = true; //说明str不在当前的字典树中,那么可将其加入其中 Trie *q = new Trie; q->v = 1; for(int j = 0;j<MAX;j++) { q->next[j] = NULL; } p->next[id] = q; p = p->next[id]; } else { p->v++; p = p->next[id]; } } p->v--; return flag; } //phone list int _tmain(int argc, _TCHAR* argv[]) { root = new Trie; root->v = 1; for(int i = 0;i<MAX;i++) root->next[i] = NULL; int times = 0; cin>>times; char str[20]; while(times--) { int nums = 0; cin>>nums; for(int i = 0;i<nums;i++ ) { cin>>str; if(Insert(str)) cout<<"YES"<<endl; else cout<<"NO"<<endl; } } return 0; }