Trie build and search

 class TrieNode
{
public:
TrieNode * next[];
bool is_word;
TrieNode(bool b = false)
{
memset(next,,sizeof(next));
is_word = b;
}
};
class Trie {
TrieNode* root;
public:
/** Initialize your data structure here. */
Trie() {
root = new TrieNode();
} /** Inserts a word into the trie. */
void insert(string word) {
TrieNode* p = root;
for(int i=;i<word.size();i++)
{
if(p->next[word[i]-'a']==NULL)
p->next[word[i]-'a']=new TrieNode();
p = p->next[word[i]-'a'];
}
p->is_word=true;
} /** Returns if the word is in the trie. */
bool search(string word) {
TrieNode* p = find(word);
return p&&p->is_word;
} /** Returns if there is any word in the trie that starts with the given prefix. */
bool startsWith(string prefix) {
return find(prefix);
} TrieNode* find(string word)
{
TrieNode* p = root;
for(int i=;i<word.size();i++)
if(p->next[word[i]-'a']==NULL)return NULL;
else p=p->next[word[i]-'a'];
return p;
}
}; /**
* Your Trie object will be instantiated and called as such:
* Trie obj = new Trie();
* obj.insert(word);
* bool param_2 = obj.search(word);
* bool param_3 = obj.startsWith(prefix);
*/

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

 class TrieNode
{
public:
TrieNode *next[];
bool is_word; TrieNode(bool b = false)
{
memset(next, , sizeof(next));
is_word = b;
}
}; class WordDictionary {
public:
/** Initialize your data structure here. */
WordDictionary() {
root = new TrieNode();
} /** Adds a word into the data structure. */
void addWord(string word) {
TrieNode *p = root;
for (int i = ; i < word.size(); i++)
{
if (p->next[word[i] - 'a'] == NULL)
p->next[word[i] - 'a'] = new TrieNode();
p = p->next[word[i] - 'a'];
}
p->is_word = true;
} /** Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter. */
bool search(string word) {
return query(word.c_str(), root);
} private:
TrieNode* root;
bool query(const char* word, TrieNode* node)
{
TrieNode* p = node;
for (int i = ; word[i]; i++)
{
if (p && word[i] != '.')
p = p ->next[word[i] - 'a'];
else if (p && word[i] == '.')
{
TrieNode* tmp=p;
for (int j = ; j < ; j++)
{
p = tmp -> next[j];
if (query(word + i + , p))
return true;
}
}
else break;
}
return p && p -> is_word;
}
};
/**
* Your WordDictionary object will be instantiated and called as such:
* WordDictionary obj = new WordDictionary();
* obj.addWord(word);
* bool param_2 = obj.search(word);
*/

word search II

1. word list insert to Trie

2. dfs search

 class TrieNode
{
public:
TrieNode *next[];
string word; TrieNode()
{
memset(next, , sizeof(next));
word = "";
}
}; class Trie
{ public:
TrieNode* root;
Trie()
{
root = new TrieNode();
} void insert(string s)
{
TrieNode *p = root;
for (int i = ; i < s.size(); i++)
{
if (p->next[s[i] - 'a'] == NULL)
p->next[s[i] - 'a'] = new TrieNode();
p = p->next[s[i] - 'a'];
}
p->word = s;
} }; void dfs(int i, int j, TrieNode* p, vector<vector<char>>& board, vector<string> &res)
{
char c = board[i][j];
if (c == '#' || p->next[c - 'a'] == NULL)return;
p = p->next[c - 'a'];
if (p->word != "")
{
res.push_back(p->word);//找到
p->word = "";//去重
}
board[i][j] = '#';
if (i > )dfs(i - , j, p, board, res);
if (j > )dfs(i, j - , p, board, res);
if (i < board.size() - )dfs(i + , j, p, board, res);
if (j < board[].size() - )dfs(i, j + , p, board, res);
board[i][j] = c;
} class Solution {
public:
vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
Trie t;
vector<string> res;
for (int i = ; i < words.size(); i++)
t.insert(words[i]);
for (int i = ; i < board.size(); i++)
for (int j = ; j < board[].size(); j++)
dfs(i, j, t.root, board, res);
return res;
}
};

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

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

 class Trie{
public:
Trie* children[];
Trie(){
children[]=NULL;
children[]=NULL;
}
}; class Solution {
public:
int findMaximumXOR(vector<int>& nums) {
if(nums.size()==)return ;
//Init Trie
Trie* root = new Trie();
for(int num:nums)
{
Trie* curNode = root;
for(int i=;i>=;i--)
{
int curBit = (num>>i)&;
if(curNode->children[curBit]==NULL)
{
curNode->children[curBit] = new Trie();
}
curNode = curNode->children[curBit];
}
}
int _max = 0xffffffff;
for(int num:nums)
{
Trie* curNode = root;
int curSum = ;
for(int i=;i>=;i--)
{
int curBit = (num>>i)&;
if(curNode->children[curBit^]!=NULL)
{
curSum += <<i;
curNode = curNode->children[curBit^];
}
else
{
curNode = curNode->children[curBit];
}
}
_max = max(curSum,_max);
}
return _max;
} };

Trie for string LeetCode的更多相关文章

  1. Implement Trie (Prefix Tree) ——LeetCode

    Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs ar ...

  2. Scramble String leetcode java

    题目: Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty subs ...

  3. Scramble String -- LeetCode

    原题链接: http://oj.leetcode.com/problems/scramble-string/  这道题看起来是比較复杂的,假设用brute force,每次做分割,然后递归求解,是一个 ...

  4. Implement Trie (Prefix Tree) - LeetCode

    Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs ar ...

  5. 438. Find All Anagrams in a String - LeetCode

    Question 438. Find All Anagrams in a String Solution 题目大意:给两个字符串,s和p,求p在s中出现的位置,p串中的字符无序,ab=ba 思路:起初 ...

  6. Interleaving String leetcode

    Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given:s1 = ...

  7. Interleaving String leetcode java

    题目: Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example, Given ...

  8. Interleaving String——Leetcode

    Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given:s1 = ...

  9. reverse string | leetcode

    思路:在原来的字符串后面添加上strlen-1个字符,返回 class Solution { public: string reverseString(string s) { unsigned int ...

随机推荐

  1. Nginx location 匹配规则详解

    语法规则 location [=|~|~*|^~] /uri/ { … } 模式 含义 location = /uri = 表示精确匹配,只有完全匹配上才能生效 location ^~ /uri ^~ ...

  2. 社区发现算法 - Fast Unfolding(Louvian)算法初探

    1. 社团划分 0x1:社区是什么 在社交网络中,用户相当于每一个点,用户之间通过互相的关注关系构成了整个网络的结构. 在这样的网络中,有的用户之间的连接较为紧密,有的用户之间的连接关系较为稀疏.其中 ...

  3. Java反射-修改字段值, 反射修改static final修饰的字段

    反射修改字段 咱们从最简单的例子到难, 一步一步深入. 使用反射修改一个private修饰符的变量name 咱们回到主题, 先用反射来实现一个最基础的功能吧. 其中待获取的name如下: public ...

  4. 背包九讲PDF

    本资料仅限个人学习交流使用,不得用于商业用途. 背包九讲PDF:https://pan.baidu.com/s/17rTxMwCo9iSTOW77yucdXQ   提取码:xbqa

  5. 2018-2019-2 《Java程序设计》第7周学习总结

    20175319 2018-2019-2 <Java程序设计>第7周学习总结 教材学习内容总结 本周学习<Java程序设计>第8章: 1.String类: Java专门提供了用 ...

  6. 半导体知识:蚀刻(Etch)工艺讲解

    本文转载自微信公众号 - 半导体行业观察  , https://mp.weixin.qq.com/s/F3LXiub6n4iYsQDqDH9K_g

  7. 如何使用门罗币远程节点remote node?

    当使用门罗币钱包的时候,都需要启动monerod,用来同步门罗币区块. 但是因为区块体积目前已经超过40G了, 所以需要花费很多天时间才能把数据同步完. 这对于使用门罗币非常的不方便. 远程节点rem ...

  8. Repeater取不到服务端控件

    <td>      <asp:Button ID="Button1" runat="server" Text="查看" O ...

  9. flex弹性盒子的使用

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! CSS3引入了一种新的布局模型—— flex 布局.flex是 flexible box 的缩写,一般称之 ...

  10. 背景上实现阴影——linear-gradient

    /*从元素顶部有条阴影,两种方式,第二种更好,能控制阴影的宽度*/background-image: linear-gradient(0deg, rgba(226, 226, 226, 0) 97%, ...