Trie for string LeetCode

Trie build and search 

 1 class TrieNode
 2 {
 3 public:
 4     TrieNode * next[26];
 5     bool is_word;
 6     TrieNode(bool b = false)
 7     {
 8         memset(next,0,sizeof(next));
 9         is_word = b;
10     }
11 };
12 class Trie {
13     TrieNode* root;
14 public:
15     /** Initialize your data structure here. */
16     Trie() {
17         root = new TrieNode();
18     }
19     
20     /** Inserts a word into the trie. */
21     void insert(string word) {
22         TrieNode* p = root;
23         for(int i=0;i<word.size();i++)
24         {
25             if(p->next[word[i]-'a']==NULL)
26                 p->next[word[i]-'a']=new TrieNode();
27             p = p->next[word[i]-'a'];
28         }
29         p->is_word=true;
30     }
31     
32     /** Returns if the word is in the trie. */
33     bool search(string word) {
34         TrieNode* p = find(word);
35         return p&&p->is_word;
36     }
37     
38     /** Returns if there is any word in the trie that starts with the given prefix. */
39     bool startsWith(string prefix) {
40         return find(prefix);
41     }
42     
43     TrieNode* find(string word)
44     {
45         TrieNode* p = root;
46         for(int i=0;i<word.size();i++)
47             if(p->next[word[i]-'a']==NULL)return NULL;
48             else p=p->next[word[i]-'a'];
49         return p;
50     }
51 };
52 
53 /**
54  * Your Trie object will be instantiated and called as such:
55  * Trie obj = new Trie();
56  * obj.insert(word);
57  * bool param_2 = obj.search(word);
58  * bool param_3 = obj.startsWith(prefix);
59  */

加 . 正则匹配一个任意字母 ,递归处理,注意p应指向当前遍历字母对应的结点

 1 class TrieNode
 2 {
 3 public:
 4     TrieNode *next[26];
 5     bool is_word;
 6 
 7     TrieNode(bool b = false)
 8     {
 9         memset(next, 0, sizeof(next));
10         is_word = b;
11     }
12 };
13 
14 class WordDictionary {
15 public:
16     /** Initialize your data structure here. */
17     WordDictionary() {
18         root = new TrieNode();
19     }
20 
21     /** Adds a word into the data structure. */
22     void addWord(string word) {
23         TrieNode *p = root;
24         for (int i = 0; i < word.size(); i++)
25         {
26             if (p->next[word[i] - 'a'] == NULL)
27                 p->next[word[i] - 'a'] = new TrieNode();
28             p = p->next[word[i] - 'a'];
29         }
30         p->is_word = true;
31     }
32 
33     /** Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter. */
34     bool search(string word) {
35         return query(word.c_str(), root);
36     }
37 
38 private:
39     TrieNode* root;
40     bool query(const char* word, TrieNode* node) 
41     {
42         TrieNode* p = node;
43         for (int i = 0; word[i]; i++) 
44         {
45             if (p && word[i] != '.')
46                 p = p ->next[word[i] - 'a'];
47             else if (p && word[i] == '.')
48             { 
49                 TrieNode* tmp=p;
50                 for (int j = 0; j < 26; j++)
51                 {
52                     p = tmp -> next[j];
53                     if (query(word + i + 1, p))
54                         return true;
55                 }
56             }
57             else break;
58         }
59         return p && p -> is_word; 
60     }
61 };
62 /**
63  * Your WordDictionary object will be instantiated and called as such:
64  * WordDictionary obj = new WordDictionary();
65  * obj.addWord(word);
66  * bool param_2 = obj.search(word);
67  */

word search II

1. word list insert to Trie

2. dfs search

 1 class TrieNode
 2 {
 3 public:
 4     TrieNode *next[26];
 5     string word;
 6 
 7     TrieNode()
 8     {
 9         memset(next, 0, sizeof(next));
10         word = "";
11     }
12 };
13 
14 class Trie
15 {
16     
17 public:
18     TrieNode* root;
19     Trie()
20     {
21         root = new TrieNode();
22     }
23 
24     void insert(string s)
25     {
26         TrieNode *p = root;
27         for (int i = 0; i < s.size(); i++)
28         {
29             if (p->next[s[i] - 'a'] == NULL)
30                 p->next[s[i] - 'a'] = new TrieNode();
31             p = p->next[s[i] - 'a'];
32         }
33         p->word = s;
34     }
35 
36 };
37 
38 void dfs(int i, int j, TrieNode* p, vector<vector<char>>& board, vector<string> &res)
39 {
40     char c = board[i][j];
41     if (c == '#' || p->next[c - 'a'] == NULL)return;
42     p = p->next[c - 'a'];
43     if (p->word != "")
44     {
45         res.push_back(p->word);//找到
46         p->word = "";//去重
47     }
48     board[i][j] = '#';
49     if (i > 0)dfs(i - 1, j, p, board, res);
50     if (j > 0)dfs(i, j - 1, p, board, res);
51     if (i < board.size() - 1)dfs(i + 1, j, p, board, res);
52     if (j < board[0].size() - 1)dfs(i, j + 1, p, board, res);
53     board[i][j] = c;
54 }
55 
56 class Solution {
57 public:
58     vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
59         Trie t;
60         vector<string> res;
61         for (int i = 0; i < words.size(); i++)
62             t.insert(words[i]);
63         for (int i = 0; i < board.size(); i++)
64         for (int j = 0; j < board[0].size(); j++)
65             dfs(i, j, t.root, board, res);
66         return res;
67     }
68 };

 421 数组中任意两个数的最大异或值

思路:建树插入所有数,对每个数按位查找异或值

 1 class Trie{
 2 public:
 3     Trie* children[2];
 4     Trie(){
 5         children[0]=NULL;
 6         children[1]=NULL;
 7     }
 8 };
 9 
10 class Solution {
11 public:
12 int findMaximumXOR(vector<int>& nums) {
13     if(nums.size()==0)return 0;
14     //Init Trie
15     Trie* root = new Trie();
16     for(int num:nums)
17     {
18         Trie* curNode = root;
19         for(int i=31;i>=0;i--)
20         {
21             int curBit = (num>>i)&1;
22             if(curNode->children[curBit]==NULL)
23             {
24                 curNode->children[curBit] = new Trie();
25             }
26             curNode = curNode->children[curBit];
27         }
28     }
29     int _max = 0xffffffff;
30     for(int num:nums)
31     {
32         Trie* curNode = root;
33         int curSum = 0;
34         for(int i=31;i>=0;i--)
35         {
36             int curBit = (num>>i)&1;
37             if(curNode->children[curBit^1]!=NULL)
38             {
39                 curSum += 1<<i;
40                 curNode = curNode->children[curBit^1];
41             }
42             else
43             {
44                 curNode = curNode->children[curBit];
45             }
46         }
47         _max = max(curSum,_max);
48     }
49     return _max;
50 }
51     
52 
53 };

 

posted @ 2019-03-15 18:10  demianzhang  阅读(196)  评论(0编辑  收藏  举报