剑指 Offer II Trie前缀树
初始化
数组初始化在class外的话 要memset 在主函数里面memset
在class内不用
062. 实现前缀树
class Trie {
public:
/** Initialize your data structure here. */
int son[100010][26],cnt[100010],idx=0;
Trie() {
memset(son,0,sizeof son);
}
/** Inserts a word into the trie. */
void insert(string word) {
int p=0;
for( char c: word)
{
int u=c-'a';
if(!son[p][u])son[p][u]=++idx;
p=son[p][u];
}
cnt[p]++;
}
/** Returns if the word is in the trie. */
bool search(string word) {
int p=0;
for(char c:word){
int u=c-'a';
if(!son[p][u])return false;
p=son[p][u];
}
return cnt[p]>0;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
bool startsWith(string prefix) {
int p=0;
for(char c:prefix){
int u=c-'a';
if(!son[p][u])return false;
p=son[p][u];
}
return true;
}
};
063. 替换单词
class Solution {
public:
int son[100010][26],cnt[100010],idx=0;
void insert(string s)
{
int p=0;
for(char c:s)
{
int u=c-'a';
if(!son[p][u])son[p][u]=++idx;
p=son[p][u];
}
cnt[p]++;
}
string check(string s)
{
string res;
int p=0;
for(char c:s)
{
int u=c-'a';
if(!son[p][u])break;
res+=c;
p=son[p][u];
if(cnt[p])return res;
}
if(cnt[p])return res;
return "";
}
string replaceWords(vector<string>& dictionary, string sentence) {
for(auto s:dictionary)insert(s);
stringstream ssin(sentence);
string ans,word;
while(ssin >>word)
{
//cout<<word<<"..."<<endl;
string x=check(word);
// cout<<x<<endl;
if(x!="")
{
ans+=x;
}
else ans+=word;
ans+=" ";
}
return ans.substr(0,ans.size()-1);
}
};
064. 神奇的字典
const int N=10001;
int son[N][26],cnt[N],idx=0;
class MagicDictionary {
public:
/** Initialize your data structure here. */
MagicDictionary() {
memset(son,0,sizeof son);
memset(cnt,0,sizeof cnt);
idx=0;
}
void insert(string s)
{
int p=0;
for(char c:s)
{
int u=c-'a';
if(!son[p][u])son[p][u]=++idx;
p=son[p][u];
}
cnt[p]++;
}
void buildDict(vector<string> dictionary) {
for(auto s:dictionary)insert(s);
}
bool dfs(string s,int p,int u,int op)
{
if(cnt[p]&&u==s.size()&&op==1)return true;//必须替换一个
if(op>1||s.size()==u)return false;
//枚举改的字母
for(int i=0;i<26;i++)
{
if(!son[p][i])continue;
if(dfs(s,son[p][i],u+1,op+(s[u]-'a'!=i)))return true;
}
return false;
}
bool search(string searchWord) {
return dfs(searchWord,0,0,0);
}
};
065. 最短的单词编码
const int N=2000*7+10;
int son[N][26],cnt[N],len[N],idx=0;
class Solution {
public:
/*
这题是求叶节点长度
*/
void insert(string s)
{
reverse(s.begin(),s.end());
int p=0;
for(char c:s)
{
int u=c-'a';
if(!son[p][u])son[p][u]=++idx;
cnt[p]++;
p=son[p][u];
}
len[p]=s.size();
}
int minimumLengthEncoding(vector<string>& words) {
memset(son,0,sizeof son);
//cnt 我有多少个叶节点 0的话我就是
memset(cnt,0,sizeof cnt);//因为len依赖cnt 所以不用初始化
idx=0;
for(auto x:words)insert(x);
int res=0;
for(int i=1;i<=idx;i++)
if(!cnt[i])res+=len[i]+1;
return res;
}
};
066. 单词之和
找到p再深搜
const int N=2501;
int son[N][26],cnt[N],idx=0;
class MapSum {
public:
/** Initialize your data structure here. */
MapSum() {
memset(son,0,sizeof son);
memset(cnt,0,sizeof cnt);
idx=0;
}
void insert(string key, int val) {
int p=0;
for(char c:key)
{
int u=c-'a';
if(!son[p][u])son[p][u]=++idx;
p=son[p][u];
}
cnt[p]=val;
}
int getp(string s)
{
int p=0;
for(char c:s)
{
int u=c-'a';
if(!son[p][u])return 0;
p=son[p][u];
}
return p;
}
int dfs(int p)
{
int sum=0;
if(cnt[p])sum+=cnt[p];
for(int i=0;i<26;i++)
{
if(son[p][i])sum+=dfs(son[p][i]);
}
return sum;
}
int sum(string prefix) {
int p=getp(prefix);
if(p==0)return 0;
return dfs(p);
}
};
067. 最大的异或
class Solution {
public:
int son[800001][2],idx=0;
void insert(int x)
{
int p=0;
for(int i=30;i>=0;i--)
{
int u=x>>i&1;
if(!son[p][u])son[p][u]=++idx;
p=son[p][u];
}
}
int query(int x)
{
int p=0,res=0;
for(int i=30;i>=0;i--)
{
int u=x>>i&1;
if(son[p][!u])
{
res=res*2+1;
p=son[p][!u];
}
else
{
res=res*2+0;
p=son[p][u];
}
}
return res;
}
int findMaximumXOR(vector<int>& nums) {
for(int x:nums)insert(x);
int res=0;
for(int x:nums)res=max(res,query(x));
return res;
}
};
剑指 Offer II Trie前缀树的更多相关文章
- 刷题-力扣-剑指 Offer II 055. 二叉搜索树迭代器
剑指 Offer II 055. 二叉搜索树迭代器 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kTOapQ 著作权归领扣网络所有 ...
- 剑指Offer - 九度1520 - 树的子结构
剑指Offer - 九度1520 - 树的子结构2013-11-30 22:17 题目描述: 输入两颗二叉树A,B,判断B是不是A的子结构. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每 ...
- 【剑指 Offer II 001. 整数除法】同leedcode 29.两数相除
剑指 Offer II 001. 整数除法 解题思路 在计算的时候将负数转化为正数,对于32位整数而言,最小的正数是-2^31, 将其转化为正数是2^31,导致溢出.因此将正数转化为负数不会导致溢出. ...
- 【剑指offer】q50:树节点最近的祖先
#@ root: the root of searched tree #@ nodeToFind: the tree-node to be found #@ path: the path from r ...
- 剑指offer(17)层次遍历树
题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. public class Solution { ArrayList<Integer> list = new ArrayLis ...
- 剑指offer(17)树的子结构
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 题目分析 分析如何判断树B是不是树A的子结构,只需要两步.很容易看出来这是一个递归的过程.一般在树 ...
- [剑指Offer]判断一棵树为平衡二叉树(递归)
题目链接 https://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId=0&tqId=0&rp=2&a ...
- 【剑指Offer】17、树的子结构
题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路: 要查找树A中是否存在和树B结构一样的子树,我们可以分为两步:第一步, ...
- 剑指Offer:面试题18——树的子结构(java实现)
问题描述: 输入两棵二叉树A和B,判断B是不是A的子结构.二叉树结点的定义如下: public class TreeNode { int val = 0; TreeNode left = null; ...
- 【剑指offer】Q18:树的子结构
类似于字符串的匹配,我们总是找到第一个匹配的字符,在继续比較以后的字符是否所有同样,假设匹配串的第一个字符与模式串的第一个不同样,我们就去查看匹配串的下一个字符是否与模式串的第一个同样,相应到这里,就 ...
随机推荐
- 2021级《JAVA语言程序设计》上机考试试题9
专业负责人功能页 <%@ page language="java" contentType="text/html; charset=UTF-8" page ...
- print()、转义字符、标识符和保留字、变量、数据类型、类型转换
安装 1.安装对应版本的Python,并进行相应的测试 2.安装对应版本的PyCharm并配置相关的内容 print()函数 输出内容是数字 输出内容是字符串 输出的内容是含有字符串的运算符的表达式 ...
- 深入理解JavaScript对象
前言 在 JavaScript 中,对象是一种非常常见的数据类型,几乎每个程序员都会在日常工作中频繁地使用对象.在本篇文章中,我们将深入了解 JavaScript 对象的一些基本概念和一些高级概念,这 ...
- 【NOIP2013提高组】华容道
分析 一个比较显然的方式是 设 \(f_{i,j,x,y}\) 表示达到空格所处位置为 \((i,j)\) 且特殊格位置为 \(x,y\) 的状态的最少步数 一次可以交换空格和相邻格,代价为 \(1\ ...
- Luogu P3919 【模板】可持久化线段树 1(可持久化数组)
板子,正好温习一下主席树的写法 记得数组开 \(32\) 倍!! \(Code\) #include<cstdio> using namespace std; const int N = ...
- RocketMQ - 消费者启动机制
RocketMQ客户端中有两个独立的消费者实现类:org.apache.rocketmq.client.consumer.DefaultMQPullConsumer 和 org.apache.rock ...
- python压缩解压文件
转载CSDN坏菠萝:https://blog.csdn.net/abcwanglinyong/article/details/80840813
- js根据某个字段进行分组
分组前数据: [ {"f1":"q","f2":"w","f3":"e",&qu ...
- forEach、for in 、 for of三者的区别
1.for 原始的遍历: 其实除了这三种方法以外还有一种最原始的遍历,自Javascript诞生起就一直用的 就是for循环,它用来遍历数组 var arr = [1,2,3,4] for(var i ...
- ASP.NET Core - 配置系统之配置读取
一个应用要运行起来,往往需要读取很多的预设好的配置信息,根据约定好的信息或方式执行一定的行为. 配置的本质就是软件运行的参数,在一个软件实现中需要的参数非常多,如果我们以 Hard Code(硬编码) ...