动态建树之——寻找前缀是否是其他字符串

本文介绍了一种使用字典树(Trie)进行号码前缀匹配的算法实现,并通过动态构建字典树来检查一系列电话号码中是否存在重复的前缀。文章提供了完整的C++代码示例,展示了如何在构建字典树的过程中实时判断是否出现冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:hdu1671

题意:寻找一个号码是否有前缀跟其他的号码一样

解答:动态建字典树(在hdu上能过,在poj上不能过)

注意:每次加入字符串的时候边加入要边判断!!!

            每建完一个树都要释放内存!!!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int sonnum = 10;
int ok = 1;
struct Trie
{
    int num;
    bool terminal;
    struct Trie *son[sonnum];
};
Trie *NewTrie()
{
    Trie *temp = new Trie;
    temp -> num = 1;
    temp -> terminal = false;
    for(int i = 0;i < sonnum;i++)
        temp -> son[i] = NULL;
    return temp;
}
void Insert(Trie *pnt,char *s,int len)
{
    Trie *temp = pnt;
    for(int i = 0;i < len;i++)
    {
        if(temp -> son[s[i] - '0'] == NULL)
            temp -> son[s[i]-'0'] = NewTrie();
        else
        {
            if(temp -> son[s[i]-'0'] -> terminal == true)
                {
                    ok = 0;
                    return;
                }
            temp -> son[s[i] - '0'] -> num++;
        }
        temp = temp -> son[s[i] - '0'];
    }
    temp -> terminal = true;
    if(temp -> num > 1)
        ok = 0;
    return;
}
void del(Trie *pnt)
{
    for(int i = 0;i < sonnum;i++)
    {
        if(pnt -> son[i] != NULL)
            del(pnt -> son[i]);
    }
    free(pnt);
}//释放内存的函数
int main()
{
    int T,n;
    char a[10];
    scanf("%d",&T);
    while(T--)
    {
        Trie *tree = NewTrie();
        scanf("%d",&n);
        while(n--)
        {
            scanf("%s",a);
            if(ok)
            Insert(tree,a,strlen(a));
        }
        if(ok == 1)
            puts("YES");
        else if(ok == 0)
            puts("NO");
        ok = 1;
        del(tree);
    }
    return 0;
}
//动态建树会t


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值