week2_Trie树

2017-03-10  本文已影响0人  vaisy

对于每一个给出的字符串,都在词典里找到以这个字符串开头的所有词;
我是真的不擅长树特别怕图论。大概数据结构真的不好。
硬着头皮编吧。
设计的数据结构是:
self:当前字母;
是否指向a-z:长度为26的数组;分别指向子树。
子树的节点个数:初始化为1,每当有路过即+1;
所以L[0]={a,0001000000000...1...0}
C不支持动态数组;所以是定义struct;然后申请100W辣么大的数组?
至于那个100w怎么算出来的。。。
我赌五毛它是觉得一个单词有10那么长还相互正交,10w个单词嘛。
100w是需要在函数外宏定义的。
这个题基本也就这样了。
我先睡一觉起来继续 太困了。
正好algorithmfans讲到Trie树

真的做的时候没有想的那么复杂。
talk is cheap。

void build(char *s)
{
    int i=0,p=0;//现在位于p点
    while(s[i])
    {
        int x=s[i]-'a';
        if(!T[p].next[x])//如果不存在,新建
        {
            T[le].init();
            T[p].next[x]=le++;//p+x的节点指向le
        }
        p=T[p].next[x];
        T[p].cnt++;
        i++;
    }
}
void query(char *s)
{
    int i=0,p=0;//现在位于p点
    while(s[i])
    {
        int x=s[i]-'a';
        if(!T[p].next[x])
        {
            puts("0");
            return ;
        }
        p=T[p].next[x];
        i++;
    }
    cout<<T[p].cnt<<endl;
}
上一篇下一篇

猜你喜欢

热点阅读