Trie

来源:互联网 发布:java支持数据库的套件 编辑:程序博客网 时间:2024/05/22 02:43
#include <iostream>#include <string>using namespace std;const int SIZE = 26;// 假设只有小写字母,每一个节点下面开 SIZE 个空间const char BASE = 'a';// 方便减法class TrieNode {public:    bool is_terminal;//通过 is_terminal 标记判断这个节点是不是从根节点到此处的一个字符串    TrieNode **childs;    TrieNode() {        is_terminal = false;        childs = new TrieNode*[SIZE];        for (int i = 0; i < SIZE; ++i) {            childs[i] = NULL; // originality     nullptr  here        }    }    ~TrieNode() {        for (int i = 0; i < SIZE; ++i) {            delete childs[i];        }        delete[] childs;    }};class StringPatterns {private:    TrieNode *root;public:    StringPatterns() {        root = new TrieNode();    }    ~StringPatterns() {        delete root;    }    void add_pattern(const string &pattern) {        TrieNode *now = root;        for (int i=0;i<pattern.length();i++)        {            if (now -> childs[pattern[i] - BASE] == NULL) // originality nullptr here            {                now -> childs[pattern[i] - BASE] = new TrieNode();            }            now = now -> childs[pattern[i] - BASE];        }        now -> is_terminal = true;    }    bool match(const string &buffer) const {        TrieNode *now = root;        for (int i=0;i<buffer.length();i++)        {            if (now -> childs[buffer[i] - BASE] == NULL) // originality nullptr here            {                return false;            }            now = now -> childs[buffer[i] - BASE];        }        return now -> is_terminal;    }};int main() {StringPatterns trie;    int n;    cin >> n;    for (int i = 0; i < n; ++i) {        string pattern;        cin >> pattern;        trie.add_pattern(pattern);    }    string str_buffer;    cin >> str_buffer;    if (trie.match(str_buffer)) {        cout << "match success" << endl;    } else {        cout << "match failed" << endl;    }    return 0;}

0 0
原创粉丝点击