剑指 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:树的子结构
类似于字符串的匹配,我们总是找到第一个匹配的字符,在继续比較以后的字符是否所有同样,假设匹配串的第一个字符与模式串的第一个不同样,我们就去查看匹配串的下一个字符是否与模式串的第一个同样,相应到这里,就 ...
随机推荐
- 《Terraform 101 从入门到实践》 Terraform在公有云Azure上的应用
<Terraform 101 从入门到实践>这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看. 简介 Azure是微软的公有 ...
- redis georadius源码分析与性能优化
原文地址: https://blog.fanscore.cn/a/51/ 背景 最近接到一个需求,开发中使用了redis georadius命令取附近给定距离内的点.完工后对服务进行压测后发现geor ...
- 学习Java Day22
今天学习了如何在包中增加类,想要将包放入类中,就必须将包的名字放在源文件的开头,即放在定义这个包中各个类的代码之前
- Java基础语法:注释、数据类型、字节
Java基础语法:注释.数据类型.字节 注释 单行注释:// 多行注释:/* 注释 */ 文档注释:/** 注释 */ 数据类型分为两大类:基本类型和引用类型 八大基本数据类型 整数类型 byte(占 ...
- Prime Distance
Description The branch of mathematics called number theory is about properties of numbers. One of th ...
- SSM框架学习-AOP学习笔记
一.AOP入门简介 AOP(Aspect Oriented Programming)面向切面编程,是一种编程范式,可以知道开发者如何组织程序结构 作用:在不惊动原始设计的基础上为其进行功能增强.(无侵 ...
- pat乙级 1019 数字黑洞
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> ...
- 【PyQt5学习-01-】PyQt5 能做什么?要学什么?
1.能做什么 简单讲,就是用python做一个界面,表达你的想法或设计 基于python语言的GUI工具库,用于开发小型的桌面应用,一些demo 也可用于课程设计,用于呈现效果,如数字图像处理.数据库 ...
- 常见的git操作
git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 git branch -a查看所有的分支 git branch -r 查看远程所有分支 git ...
- linux中进程和线程简单介绍
进程和线程的简单知识 进程是用来申请内核资源的,只有资源到位,进程才会进行,进程包含线程,线程是进程内部的调度单位,所以在业内有这样一句话,进程是资源分配最基本单位,线程是系统调度的最基本的单位,进程 ...