字典树(Trie树)用法及例子(二)

上接http://blog.csdn.net/u010902721/article/details/45749447

例二

问题:

有一组字符串,这一组字符串中,有没有两个字符串A和B,满足A是B的前缀。

分析:

我们只要区分开”abcde”、”abcxy”、”ab”就行了。node中i就用做一个flag了,等于1表示这个字符是某个已插入字符串的结尾字符。这样在在先插入了”ab”之后再插入”abcde”就能找到了。另外还有可能先插入了”abcde”,再插入了”ab”,当插入新的字符串时发现字符串插入完成了还没有新建节点,那就出现了这种情况,也返回true。

#include<iostream>
#include<string>

using namespace std;
const int MAX_NUM = 26;
struct trieNode{
    int i;//标志位,为1表示是某个字符串最后一个字符
    struct trieNode *next[MAX_NUM];
};

trieNode* CreateTrieNode(){
    trieNode *p = new trieNode;
    p->i = 0;
    for(int i = 0; i < MAX_NUM; i++)
        p->next[i] = NULL;
    return p;
}

bool InsertTrieTree(trieNode **root, string str){
    trieNode *p;
    if(*root == NULL){
        p = CreateTrieNode();
        *root = p;
    }
    else
        p = *root;
    int len = str.length();
    int k;
    for(int i = 0; i < len; i++){
        k = str.at(i) - 'a';
        if(p->next[k] != NULL){
            if(p->next[k]->i == 1 || i+1 == len)//分析中的两种情况
                return true;
        }
        else
            p->next[k] = CreateTrieNode();
        p = p->next[k];
    }
    p->i = 1;//字符串结束
    return false;
}

int main(){
    trieNode *root = NULL;
    cout << InsertTrieTree(&root, "checking");   //print 0
    cout << InsertTrieTree(&root, "check");      //print 1
    cout << InsertTrieTree(&root, "for");        //print 0
    cout << InsertTrieTree(&root, "checking");   //print 1
    cout << InsertTrieTree(&root, "program");    //print 0
    cout << InsertTrieTree(&root, "programmer"); //print 1
}
    原文作者:Trie树
    原文地址: https://blog.csdn.net/u010902721/article/details/45749745
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞