主要的思想是字典树
字典树
主要思想:
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)数据结构的灵活使用!!!