这是一道最简单的trie树的题
有趣的是这道题的测试用例无法在VS上调试,只能在框框里不断提交测试了,哈哈
最基本的Trie树,插入和查找操作没什么好说的
注意节点添加一个count变量作为附加条件,记录该字母这这个位置出现的次数,还有几处需要注意的逻辑问题,在注释中标出了
直接上代码了:
#include <iostream> #include <algorithm> #include <string.h> #include <stdio.h> using namespace std; char strList[1005][25]; struct node { int count; node* childs[26]; node(){ count = 0; int i; for(i=0;i<26;i++){ childs[i] = NULL; } } }; node* root = new node; node* currentNode; void insert(char *str) { int i=0; currentNode = root; for(i=0;i<strlen(str);i++){ int index= str[i] - 'a'; if(currentNode->childs[index]!=NULL){ currentNode = currentNode->childs[index]; ++(currentNode->count); }else{ currentNode->childs[index] = new node; currentNode = currentNode->childs[index]; currentNode->count = 1; } } } void search(char *str) { currentNode = root; int i; char res[23]; for(i=0;i<strlen(str);i++){ int index = str[i] - 'a'; //if(currentNode->childs[index]!=NULL)//没有必要判断,因为根据题意,此时一定是有的 currentNode = currentNode->childs[index]; res[i] = str[i]; res[i+1]='\0';//必须在这里加入'\0',因为如果没有找到,则会跳出,如果在下面的判断中加‘\0’会导致最后没有结尾的'\0'. if(currentNode->count == 1){break;}//输出+return 或者 直接break } printf("%s %s\n",str,res); return; } int main() { int i,t=0; while(scanf("%s",strList[t])!=EOF) { insert(strList[t]); t++; } for (i = 0; i < t; ++i) { search(strList[i]); } return 0; }