初始化

数组初始化在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前缀树的更多相关文章

  1. 刷题-力扣-剑指 Offer II 055. 二叉搜索树迭代器

    剑指 Offer II 055. 二叉搜索树迭代器 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kTOapQ 著作权归领扣网络所有 ...

  2. 剑指Offer - 九度1520 - 树的子结构

    剑指Offer - 九度1520 - 树的子结构2013-11-30 22:17 题目描述: 输入两颗二叉树A,B,判断B是不是A的子结构. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每 ...

  3. 【剑指 Offer II 001. 整数除法】同leedcode 29.两数相除

    剑指 Offer II 001. 整数除法 解题思路 在计算的时候将负数转化为正数,对于32位整数而言,最小的正数是-2^31, 将其转化为正数是2^31,导致溢出.因此将正数转化为负数不会导致溢出. ...

  4. 【剑指offer】q50:树节点最近的祖先

    #@ root: the root of searched tree #@ nodeToFind: the tree-node to be found #@ path: the path from r ...

  5. 剑指offer(17)层次遍历树

    题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. public class Solution { ArrayList<Integer> list = new ArrayLis ...

  6. 剑指offer(17)树的子结构

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 题目分析 分析如何判断树B是不是树A的子结构,只需要两步.很容易看出来这是一个递归的过程.一般在树 ...

  7. [剑指Offer]判断一棵树为平衡二叉树(递归)

    题目链接 https://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId=0&tqId=0&rp=2&a ...

  8. 【剑指Offer】17、树的子结构

      题目描述:   输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构)   解题思路:   要查找树A中是否存在和树B结构一样的子树,我们可以分为两步:第一步, ...

  9. 剑指Offer:面试题18——树的子结构(java实现)

    问题描述: 输入两棵二叉树A和B,判断B是不是A的子结构.二叉树结点的定义如下: public class TreeNode { int val = 0; TreeNode left = null; ...

  10. 【剑指offer】Q18:树的子结构

    类似于字符串的匹配,我们总是找到第一个匹配的字符,在继续比較以后的字符是否所有同样,假设匹配串的第一个字符与模式串的第一个不同样,我们就去查看匹配串的下一个字符是否与模式串的第一个同样,相应到这里,就 ...

随机推荐

  1. C语言-三子棋项目

    开源地址 https://kxd.lanzoul.com/iLwHG0e4nupc 肯定有大量BUG 求指出 电脑自动下棋的算法很差 毕竟我也没特意去研究

  2. 三分钟使用chatGPT

    ChatGPT最近也是火爆出圈,网上已被刷屏. 今天我们说一下,使用ChatGPT的方法,很简单,只需要三步: 前期确保自己能访问google,IP地址为某些国家:否则检查会报错:Services a ...

  3. 玫瑰花变蚊子血,自动化无痕浏览器对比测试,新贵PlayWright Vs 老牌Selenium,基于Python3.10

    也许每一个男子全都有过这样的两个女人,至少两个.娶了红玫瑰,久而久之,红的变了墙上的一抹蚊子血,白的还是床前明月光:娶了白玫瑰,白的便是衣服上沾的一粒饭黏子,红的却是心口上一颗朱砂痣.--张爱玲< ...

  4. vue-cli 更新遇到的问题,卸载不掉旧版本2.9.6(可行)

    今天更新vue-cli时,遇到问题:卸载不掉旧版本2.9 官网给的信息是:Vue CLI 的包名称由 vue-cli 改成了 @vue/cli. 如果你已经全局安装了旧版本的 vue-cli (1.x ...

  5. wpf 样式style封装以及点击按钮打开新窗口

    在页面引用: ok~ 点击按钮打开新窗口: 1.点击按钮 点击工具栏的这个小闪电 2.双击click后的灰框或者输入点击事件名称 3.这里是打开window1窗口 ok~

  6. ArcGIS for Android 实现地图基本操作

    地图基本操作 1.前期项目准备 1.1. 创建新工程 新建一个空活动项目 选择语言.平台,修改命名等 1.2. 添加ArcGIS SDK build.gradle (Project: <proj ...

  7. LeetCode-794 有效的井字游戏

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/valid-tic-tac-toe-state 题目描述 用字符串数组作为井字游戏的游戏板 boa ...

  8. 【HTML】HTML特殊字符大全

    使用方法:这些字符属于unicode字符集,所以,你的文档需要声明为UTF-8:下面符号列表的后面有两列编号,它们并不太一样,第一列是用于html的,你需要在前面加上&#符号:第二列可以用于C ...

  9. pg高可用方案repmgr带witness搭建

    一.总体架构 操作系统版本: linux redhat7.6pg版本: 12.2repmgr版本 5.2192.168.3.73 主库: repmgr+master192.168.3.74 从库1: ...

  10. .Net Core Elasticsearch 时间查询问题

    查询时增加条件需要设置时区,这样时间才不会出现问题. new QueryContainerDescriptor<T>().DateRange(t => t.Field(f => ...