2797:最短前缀

主要的思想是字典树

字典树

主要思想:
1.根节点不含任何字符
2.每一层最多26个 ,26条路径代表26个字母
3.从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。
在这里插入图片描述
最基本的字典树结构:

struct trie{
	trie *node[26];
	char end;//结束标志,即为1则到这个节点形成一个字符串
	........//根据你需要定义
};

应用场景

1)字符串检索

2)排序

			先序遍历就是按字典升序排列

3)字符串前缀相关

AC代码

//字典树
//输入同时插入 记录前缀
//查找 前缀个数为1 的就是最短
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct Trie{
	trie *next[26];
	int num;//有多少个单词的前缀 
}trie;
trie root;
//初始化 
void init(trie* node){
	for(int i=0;i<26;i++)
		node->next[i] = NULL;
	node->num =0;
}
void insert(char* str){
	trie *p = &root;
	for(int i=0;str[i];i++){
		int t = str[i] - 'a';
		if(p->next[t]==NULL){
			p->next[t] = new trie;
			init(p->next[t]);
		}
		p= p->next[t];
		p->num++; 
	}
}
void find(char* str){
	trie *p = &root; 
	for(int i=0;str[i];i++)
	{
		int t = str[i] - 'a';
		//如果整个单词遍历到空,都没有num为1的前缀就输出自己 
		if(p->next[t]==NULL) 
			return;
		p = p->next[t];
		printf("%c",str[i]);
		//找到NUM为1 即只有一个单词的前缀是这样,就输出完毕 
		if(p->num == 1)
			return;
	}
}
int main(){
	init(&root);
	int n=0;
	char alpha[1001][21];
	//输入并建立字典树 
	while(scanf("%s",alpha[n])!=EOF){
		insert(alpha[n]);
		n++;
	}
	//查找最短字串 
	for(int i=0;i<n;i++){
		printf("%s ",alpha[i]);
		find(alpha[i]);
		printf("\n");
	}
}

总结

1)数据结构的灵活使用!!!

https://www.cnblogs.com/justinh/p/7716421.html 字典树

猜你喜欢

转载自blog.csdn.net/u013129143/article/details/82996375