剑指 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:树的子结构
类似于字符串的匹配,我们总是找到第一个匹配的字符,在继续比較以后的字符是否所有同样,假设匹配串的第一个字符与模式串的第一个不同样,我们就去查看匹配串的下一个字符是否与模式串的第一个同样,相应到这里,就 ...
随机推荐
- Listen 1音乐播放器
Listen 1 Listen 1可以搜索和播放来自网易云音乐,QQ音乐,酷狗音乐,酷我音乐,Bilibili,咪咕音乐网站的歌曲,让你的曲库更全面.还支持歌单功能,你可以方便的播放,收藏和创建自己的 ...
- .net core 前端传递参数有值 后端接收到的数据却是null
1.问题分析 在做接口测试时,偶然出现了前端输出有值,但是后端断点调试时却出现接收参数总是为null的情况 2.解决办法 前端打印log,看前端的每一个传值的数据类型,与后端请求参数类进行认真的一一比 ...
- STM32F4库函数初始化系列:三重ADC——DMA
1 void _DMA_Configuration(void) 2 { 3 DMA_InitTypeDef DMA_InitStructure; 4 5 /* DMA2 Stream0 channel ...
- Java基础语法:注释、数据类型、字节
Java基础语法:注释.数据类型.字节 注释 单行注释:// 多行注释:/* 注释 */ 文档注释:/** 注释 */ 数据类型分为两大类:基本类型和引用类型 八大基本数据类型 整数类型 byte(占 ...
- NSDT可编程3D场景
推荐:将 NSDT场景编辑器 加入你的3D开发工具链. NSDT编辑器简化了WebGL 3D应用的开发,完全兼容Three.JS生态.本文介绍如何在自己的应用中嵌入使用NSDT编辑器搭建的3D场景,并 ...
- ajax请求头
headers: { 'token':token, 'identity':identity, 'Content-Type': 'application/x-www-form-urlencoded' } ...
- 计算属性报错:Maximum recursive updates exceeded.
计算属性或普通函数中有对相关依赖的响应式数据进行一次以上的更新就可能导致达到最大执行的限制: const calcSurplus = computed(() => (k: string) =&g ...
- Android:ViewModel
什么是 ViewModel ViewModel 旨在以注重生命周期的方式存储和管理界面相关数据.ViewModel 让数据可在发生屏幕旋转等配置更改后继续留存. 上面一段话是截取自官方文档对 View ...
- Postgresql如何防止数据库雪崩
一.背景 在数据库的使用过程中,一些微妙的操作,在特殊的场景中就可能导致雪崩效应. 1. 当数据库中存在未提交事务,并且未提交事务已经持有了某个表的哪怕是最小的锁时,如果此时对这个对象发起DDL操作, ...
- Mogeaver 连接数据库
下载安装Mogeaver是一款开源软件,下载地址如下:https://docs.mogdb.io/zh/mogdb/v3.0/mogeaver-release-notes 根据您的操作系统选择相应的安 ...