字典树的描述
数据结构:多叉树
内容:字符串按照出现的顺序依次构成树的边,每条边代表一
字符。
前缀树是N叉树的一种特殊形式。通常来说,一个前缀树是用来存储字符串的。前缀树的每一个节点代表一个字符串(前缀)。
每一个节点会有多个子节点,通往不同子节点的路径上有着不同的字符。子节点代表的字符串是由节点本身的原始字符串,以及通往该子节点路径上所有的字符组成的。
对字典树进行前序遍历获得字典序
操作:
1.tri.insert(“字符串”)
2.tri.search(“字符串”);
字典树建树
struct TrieNode{
TrieNode* next[26];
bool isEnd;
TrieNode(){
for(int i=0;i<26;i++) next[i]=nullptr;
isEnd = false;
}
}
for(auto &res:wordDict){
int n = res.size();
TrieNode*p = root;
for(int i=0;i<n;i++){
if(!p->next[res[i]-'a']) p->next[res[i]-'a']=new TrieNode();
p = p->next[res[i]-'a'];
}
p->isEnd = true;
}
字典树操作的实现’
插入操作代码:
void insert(root r,string s){
for(int i = 0;i<s.length();i++){
char c = s[i];
if(!r.contain(c)){
r.addchild(c);
r = r.nextnode(c);
}else{
r = r.nextnode(c);
}
}
r.makeend();
}
查找操作代码:
单调栈
维护stack结构,保证栈中元素按照一定顺序排列。
一种数据结构:
单调队列主要用于 [公式] 解决滑动窗口问题,
单调栈则主要用于 [公式] 解决NGE问题(Next Greater Element),
也就是,对序列中每个元素,找到下一个比它大的元素。
使用场景:寻找左右更大或更小元素
原理:空间换时间,用单调栈记录某个方向更大的元素。
例如:
已知序列:
3 4 2 7 9
一次遍历寻找每个元素左边或右边最近且更小的元素(正向或反向入栈)
保证stack维持递增序列,
3大于栈顶入栈,左边为-1
4大于栈顶入栈,左边为3
2小于栈顶出栈、出栈、入栈,左边为-1
7大于栈顶入栈,左边为2
9大于栈顶入栈,左边为7
案例:
vector<int> nextGreaterElement(vector<int>& nums) {
vector<int> res(nums.size()); // 存放答案的数组
stack<int> s;
// 倒着往栈里放
for (int i = nums.size() - 1; i >= 0; i--) {
// 判定个子高矮
while (!s.empty() && s.top() <= nums[i]) {
// 矮个起开,反正也被挡着了。。。
s.pop();
}
// nums[i] 身后的 next great number
res[i] = s.empty() ? -1 : s.top();
//
s.push(nums[i]);
}
return res;
}
寻找下一个更大的数字:
1、从右往左入栈,则结果是从左往右出栈
2、求更大元素,将被挡住的较小元素移除