LeetCode-Add and Search Word - Data structure design-前缀树

来源:互联网 发布:软件生命周期模型对比 编辑:程序博客网 时间:2024/05/16 19:13

原题链接https://leetcode.com/problems/add-and-search-word-data-structure-design/

Design a data structure that supports the following two operations:

void addWord(word)bool search(word)

search(word) can search a literal word or a regular expression string containing only lettersa-z or .. A . means it can represent any one letter.

For example:

addWord("bad")addWord("dad")addWord("mad")search("pad") -> falsesearch("bad") -> truesearch(".ad") -> truesearch("b..") -> true

实现前缀树。

trieNode 中的flag表示是否以该节点结尾的单词存在

class TrieNode {public:TrieNode* next[26];bool flag;TrieNode() {for (int i = 0; i < 26; ++i)next[i] = NULL;flag = false;}};class Trie {public:TrieNode* root;Trie() {root = new TrieNode();}void insert(string& word) {TrieNode* tmp = root;for (auto &c : word){if (tmp->next[c - 'a'] == NULL)tmp->next[c - 'a'] = new TrieNode();tmp = tmp->next[c - 'a'];}tmp->flag = true;}};class WordDictionary {public:Trie trie;void addWord(string word) {trie.insert(word);}bool search(string word) {return dfs(word, 0, trie.root);}bool dfs(string& str, int pos, TrieNode* root){if (root == NULL)return false;if (str.length() == pos && root != NULL)return root->flag;if (str[pos] != '.')return dfs(str, pos + 1, root->next[str[pos] - 'a']);elsefor (int i = 0; i < 26; ++i)if (dfs(str, pos + 1, root->next[i]))return true;return false;}};


0 0