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. 使用sshpass同时更新一台ubuntu和一台CentOS

    1.在ubuntu上安装sshpass sudo apt install sshpass 2.分别在两台的root路径下放上升级脚本: cent:/root/upgrade.sh #!/bin/bas ...

  2. java-最大连续子数组和(最大字段和)

    1.题目要求   给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最大值.当所给的整数均为负数时定义子段和为0, ...

  3. 树莓派中QT实现串口通讯

    树莓派中QT实现串口通讯 开发平台为QT 此博客QT使用的为WiringPi驱动 我使用的串口调试助手为 cutecom 先简单说一些开发过程中需要注意的问题 Linux 下设备为 tty ,对应在 ...

  4. Linux Centos7.x下安装部署VNC的实操详述

    VNC (Virtual Network Console)是虚拟网络控制台的缩写.它 是一款优秀的远程控制工具软件,由著名的AT&T的欧洲研究实验室开发的.VNC 是在基于 UNIX和 Lin ...

  5. QTcpSever和QTcpSocket实现多线程客户端和服务端;

    QTcpServer提供了newConnection信号, 可以通过connect实现连接槽函数,利用nextPendingConnection 函数获取连接的QTcpSocket * :也可以继承Q ...

  6. 深度学习二、CNN(卷积神经网络)概念及理论

    一.卷积神经网络(CNN) 1.常见的CNN结构有:LeNet-5.AlexNet.ZFNet.VGGNet.ResNet等.目前效率最高的是ResNet. 2.主要的层次: 数据输入层:Input ...

  7. JDK常用命令行工具(基于JDK10)

    虽然我是在jdk10环境下, 但是大体上和jdk8是差不多的. 总共有这么多 本来想着一口气把所有命令都边学边总结一下的, 结果发现....有些还真的不是很常用....或者说我这个水平还接触不到那么多 ...

  8. WebApi系列(从.Net FrameWork 到 .Net Core)

    一. 简介  1. 什么是WebApi? WebApi是一个很广泛的概念,在这里我们特指.Net平台下的Asp.Net WebApi框架,它是针对各种客户端(浏览器.APP等)来构建Http服务的一个 ...

  9. 深入浅出mybatis之缓存机制

    目录 前言 准备工作 MyBatis默认缓存设置 缓存实现原理分析 参数localCacheScope控制的缓存策略 参数cacheEnabled控制的缓存策略 总结 前言 提到缓存,我们都会不约而同 ...

  10. 《11招玩转网络安全》之第三招:Web暴力破解-Low级别

    Docker中启动LocalDVWA容器,准备DVWA环境.在浏览器地址栏输入http://127.0.0.1,中打开DVWA靶机.自动跳转到了http://127.0.0.1/login.php登录 ...