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. (十一)QPainter绘图, QPixmap,QImage,QPicture,QBitmap

    #include "widget.h" #include "ui_widget.h" #include <QPainter> #include &l ...

  2. iOS开发,这样写简历才能让大厂面试官看重你!

    前言: 对于职场来说,简历就如同门面.若是没想好,出了差错,耽误些时日倒不打紧,便是这简历入不了HR的眼,费力伤神还不能觅得好去处,这数年来勤学苦练的大好光阴,岂不辜负? 简历,简而有力.是对一个人工 ...

  3. StackExchange.Redis 异步超时解决方案

    Timeout awaiting response (outbound=0KiB, inbound=45417KiB, 5891ms elapsed, timeout is 5000ms), comm ...

  4. Windows API 调用示例

    Ø  简介 本文主要记录 Windows API 的调用示例,因为这项技术并不常用,属于 C# 中比较孤僻或接触底层的技术,并不常用.但是有时候也可以借助他完成一些 C# 本身不能完成的功能,例如:通 ...

  5. step into,step over,step out.

    step into:单步执行,遇到子函数就进入并且继续单步执行(简而言之,进入子函数): step over:在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止, ...

  6. AQS学习笔记之独占锁

    作用 参与 共享锁 acquireShared() 和 独占锁 acquire() 的抢锁逻辑, 具体的抢锁逻辑不作实现,只对第一次抢锁未抢到锁线程做处理,第一次抢锁就抢到的线程就不需要遇到AQS了 ...

  7. L1-Day8

    1.他就是我昨天见的那个人. [我的翻译]He is a man who I saw him yestorday. [标准答案]He is the man (who(m) /that) I saw y ...

  8. Web项目容器集成ActiveMQ & SpringBoot整合ActiveMQ

    集成tomcat就是随项目启动而启动tomcat,最简单的方法就是监听器监听容器创建之后以Broker的方式启动ActiveMQ. 1.web项目中Broker启动的方式进行集成 在这里采用Liste ...

  9. mac 终端里进入mysql和退出

    先在偏好设置里启动mysql服务 获取超级权限 在终端输入代码 sudo su 输入完后获取超级权限 终端显示 sh-3.2# 输入本机密码(Apple ID密码) 接着通过绝对路径登陆 代码 /us ...

  10. 项目Alpha冲剂(3/10)

    1.项目燃尽图 2.今日进度描述 项目进展 完成数据库和服务器的连接部分,完成了一些应用的基本功能. 问题困难 完成了服务器的成功配置,同时实现了客户端与服务器的连接 心得体会 进度有明显的变化,成员 ...