字典树和单调栈

字典树的描述

 数据结构:多叉树
 内容:字符串按照出现的顺序依次构成树的边,每条边代表一
 字符。
 前缀树是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、求更大元素,将被挡住的较小元素移除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值