标签:定义 unique -o stat href ems comm print 技术分享
以下为自己个人学习字典树的一些总结(不一定对,初学)
字典树用一张图就可以看懂他的作用:
单词列表为”apps”,”apply”,”apple”,”append”,”back”,”backen”以及”basic”对应的字母树可以是如下图所示。
定义一个结构体:
typedef struct Tire_node
{
int cnt; //记录该前缀出现了几次
struct Tire_node* next[26];//视情况而定,一个字母下的其他分支
} Tirenode,*Tire;
cnt 存这个结点的经过次数,比如a这个点(第二层,apple的开头的a),这个点后面有一个分支(因为这些点的后面都跟得是p)。
为什么next这个数组的大小是26呢?
因为我们写的这个函数的作用是查单词出现没有,单词如果只是大写或者小写,只有26.
下面附一个初学的题:
Description
Input
Output
Sample Input
carbohydrate cart carburetor caramel caribou carbonic cartilage carbon carriage carton car carbonate
Sample Output
carbohydrate carboh cart cart carburetor carbu caramel cara caribou cari carbonic carboni cartilage carti carbon carbon carriage carr carton carto car car carbonate carbona
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <map> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #define ll long long #define INF 0x3f3f3f3f #define PI acos(-1) const int MAX=1e5+10; using namespace std; typedef struct Tire_node { int cnt; //记录该前缀出现了几次 struct Tire_node* next[26];//视情况而定,一个字母下的其他分支 } Tirenode,*Tire; char s[1005][25]; Tire CreatTirenode() { Tire node=(Tire)malloc(sizeof(Tirenode)); node->cnt=0; memset(node->next,0,sizeof(node->next)); return node; } void Tire_insert(Tire root,int k) { int i; Tire node=root; int len=strlen(s[k]); for(i=0;i<=len-1;i++) { int a=s[k][i]-‘a‘; if(node->next[a]==NULL) node->next[a]=CreatTirenode(); node=node->next[a]; node->cnt++; } } void Tire_search(Tire root,int k) { Tire node=root; int i; int len=strlen(s[k]); for(i=0;i<=len-1;i++) { int a=s[k][i]-‘a‘; node=node->next[a]; if(node->cnt==1) { printf("%c",a+‘a‘); return ; } else { printf("%c",a+‘a‘); } } } int main() { Tire root=CreatTirenode(); int i=0; while(scanf("%s",s[i])!=EOF) { Tire_insert(root,i); i++; } for(int j=0; j<=i; j++) { printf("%s ",s[j]); Tire_search(root,j); printf("\n"); } return 0; }
构造字典树以及查询操作如下:
代码如下:
标签:定义 unique -o stat href ems comm print 技术分享
原文地址:https://www.cnblogs.com/bhd123/p/9965910.html