标签:字典树
分析:一开始是用递归做的,没做出来,于是就换了现在的数组。即,把每一个输入的字符串都存入二维数组中,然后创建字典树。输入和创建完毕后,开始查找。
其实一开始就读错题目了,题目要求字符串是由其他两个输入的字符串组成的前后缀,自己根本没有判断前缀是否满足,就直接判断后缀,一直想不通自己哪里错了,很惭愧,水平还是不行。
查找分为前缀查找和后缀查找,其实两个函数基本差不多的。下面放代码。
#include <cstdio> #include <cstring> #include <iostream> using namespace std; struct trie { trie *next[26]; int v; //字符相同的个数 trie() { memset(next,NULL,sizeof(next)); v=1; } }; trie *root=new trie(); char s[50001][101]; void creat_trie(char *str) { int i,id; trie *p; for(p = root,i=0;str[i]; ++i) { id = str[i]-'a'; if(p->next[id] == NULL) { p->next[id] = new trie(); } p = p->next[id]; } p->v = -1; } int find_trie(char *str) { int i=0,j,id; trie *p = root; for(;*str != '\0';) { id= *str - 'a' ; if (p->next[id] != NULL) { p = p->next[id]; if(p->v == -1 && *(str+1) == '\0') return 1; str++; } else return 0; } return 0; } int find(char *str) { trie *p = root; int m; for (;*str != '\0';) { m = *str - 'a'; p = p->next[m]; if(p != NULL) { if (p->v == -1 && find_trie(str+1)) { return 1; } str++; } else return 0; } return 0; } int main() { int N,n,i=0,j,t,m,flag=0; int a,b,c,d,k; int sum; trie *p; while (gets(s[i]),s[i][0] != '\0')//,s[i][0] != '\0' { creat_trie(s[i++]); } for (j=0;j<i;j++) { if (find(s[j])) { puts(s[j]); } } return 0; }
a ahat hat hatword hziee word
ahat hatword
标签:字典树
原文地址:http://blog.csdn.net/xinwen1995/article/details/46402085