【重点】【栈+特例】394.字符串解码

本文介绍了一种使用栈实现的解码字符串方法,针对包含嵌套括号和数字的编码,通过维护两个栈来解析并还原原始字符串。

题目

法1:基于栈

重点是记忆该题思路!!!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Python

class Solution:
    def decodeString(self, s: str) -> str:
        res, stack, multi = '', [], 0
        for c in s:
            if c == '[':
                stack.append([multi, res]) # [当前结果的倍数, 之前字符串]
                multi = 0
                res = ''
            elif c == ']':
                curMulti, last_res = stack.pop()
                res = last_res + curMulti * res
            elif '0' <= c <= '9':
                multi = 10*multi + int(c)
            else:
                res += c
        
        return res

注意:关于python的一些语法知识
关键点分析:
(1)列表存储的是引用:
当执行stack.append([multi, res])时,列表[multi, res]会被添加到栈中。
列表中存储的是multi和res的当前值的引用(即指向这两个对象的指针)。
(2)不可变类型的特性:
multi是整数(不可变类型),res是字符串(同样不可变)。
不可变对象一旦创建,其值无法被修改,只能被重新赋值(即变量指向新的对象)。
(3)代码逻辑的安全性:
在遇到[时,multi和res的当前值被保存到栈中。
随后,multi被重置为0,res被重置为空字符串’'。
在遇到]时,从栈中弹出的是之前保存的原始值(因为整数和字符串不可变,原始值未被修改)。

Java

class Solution {
    public String decodeString(String s) {
        int multi = 0, i = 0;
        StringBuilder res = new StringBuilder();
        LinkedList<Integer> multiStack = new LinkedList<>();
        LinkedList<String> stringStack = new LinkedList<>();
        while (i < s.length()) {
            char c = s.charAt(i);
            if (c == '[') {
                multiStack.offerLast(multi);
                stringStack.offerLast(res.toString());
                multi = 0;
                res = new StringBuilder();
            } else if (c == ']') {
                StringBuilder tmpBuilder = new StringBuilder();
                int tmpMulti = multiStack.removeLast();
                for (int j = 0; j < tmpMulti; ++j) {
                    tmpBuilder.append(res);
                }
                res = new StringBuilder(stringStack.removeLast() + tmpBuilder.toString());
            } else if (c >= '0' && c <= '9') {
                multi = 10 * multi + c - '0';
            } else {
                res.append(c);
            }
            ++i;
        }

        return res.toString();
    }
}
哈夫曼编解码器 Description 在文件压缩与网络传输中,哈夫曼编码(Huffman Coding)是一种经典的无损压缩算法。 它通过构建哈夫曼树来为每个字符分配不同长度的二进制编码,使高频字符拥有更短的编码,从而显著降低存储或传输开销。 现在,你需要实现一个简化版的哈夫曼编码系统。 系统可以根据给定的字符频率表构建哈夫曼树,生成编码表,并支持对二进制文本进行解码。 Input 第一行:整数 N (1 ≤ N ≤ 128),表示参与编码的字符种类数。 接下来 N 行:每行包含一个字符 ch 和一个整数 freq,用空格分隔,表示该字符及其出现频率。 特殊说明:空格字符用字符串 "space" 表示。 说明:ch 必须是单一字符(或字符串 "space" 表示空格),且只包含可打印 ASCII 字符(或 space)。 第 N+2 行:一个整数 Q (1 ≤ Q ≤ 10),表示后续有多少个操作。 接下来 Q 行:每行一条操作,格式如下: TABLE —— 输出字符的哈夫曼编码表,按照字符 ASCII 升序排列(space 在表中仍以字样 space 输出); ENCODE—— 将按哈夫曼编码规则转为二进制字符串并输出; 仅包含在频率表中出现的字符;输入中的空格用实际空格 ' ' 表示; DECODE—— 对给定的二进制字符串(只包含 '0' 与 '1')执行解码,输出原文字符串(空格原样输出)。 Output 对于 TABLE 操作:每行输出一条 ch:code 若字符为 "space",输出 space:code 对于 ENCODE操作:输出对应的二进制编码串 对于 DECODE操作:输出解码后的原文字符串 Sample Input 1 6 a 5 b 9 c 12 d 13 e 16 f 45 3 TABLE ENCODE face DECODE 01100100111 Sample Output 1 a:1100 b:1101 c:100 d:101 e:111 f:0 01100100111 face Sample Input 2 4 space 40 A 10 B 20 C 30 3 TABLE ENCODE A B C DECODE 1000101011 Sample Output 2 space:0 A:100 B:101 C:11 1000101011 A B C Hint 说明 哈夫曼树构建规则 为保证哈夫曼树与编码唯一,构造过程中使用统一的优先级比较准则来选择并合并结点: 每个结点维护两个属性:freq(子树总频率)和 min_ascii(该结点叶子集合中 ASCII 码最小的字符的 ASCII 值。对 "space" 使用 ASCII 32)。对叶子结点,min_ascii 即该字符的 ASCII 值。 使用一个优先队列(或每步对结点集合排序)按以下元组升序比较结点:(freq, min_ascii)即:先比较 freq(频率小的优先),若频率相等,则 min_ascii 小的优先。 每一步从队列中取出两个最小的结点(若存在 tie,则上面规则决定顺序);先取出的结点作为左子树,后取出的作为右子树,合并成新结点,新结点的 freq = sum(freq),min_ascii = min(min_ascii_left, min_ascii_right),并将新结点放回优先队列。 特例:若 N == 1(只有单个字符),规定该字符的编码为 "0"(以便编码/解码不产生空串)。 编码规则 左子树边记为 '0',右子树边记为 '1'; 从根节点到叶节点路径即为该字符的哈夫曼编码。 输入输出细节 TABLE 输出按字符 ASCII 升序排列;在排序时把 space 看作 ASCII 32 的字符并在表中以 space:code 形式输出。 ENCODE 中的空格为真实空格字符 ' '; Language: C++ CPP 使用范围 禁止使用 • 现成容器与容器适配器:如果题目要求你实现单链表/双链表/队列//集 合/映射/堆/优先队列/哈希表等,不得用对应 STL 容器或能直接替代其 功能的结构。例如 stack,queue,deque,list,set,map 等等。 • 禁止使用标准库提供的算法实现:例如要求实现排序时,禁止 std::sort / std::stable_sort / std::nth_element 等等 允许使用 • CPP 中的面向对象,模版以及基本的语法增强。 • std::string 与基本 I/O 允许;解析/打印与题目无关的辅助逻辑可以用这些库完成。 时间限制1000MS 内存限制256MB 将代码进行修改
10-28
计及源荷不确定性的综合能源生产单元运行调度与容量配置优化研究(Matlab代码实现)内容概要:本文围绕“计及源荷不确定性的综合能源生产单元运行调度与容量配置优化”展开研究,利用Matlab代码实现相关模型的构建与仿真。研究重点在于综合能源系统中多能耦合特性以及风、光等可再生能源出力和负荷需求的不确定性,通过鲁棒优化、场景生成(如Copula方法)、两阶段优化等手段,实现对能源生产单元的运行调度与容量配置的协同优化,旨在提高系统经济性、可靠性和可再生能源消纳能力。文中提及多种优化算法(如BFO、CPO、PSO等)在调度与预测中的应用,并强调了模型在实际能源系统规划与运行中的参考价值。; 适合人群:具备一定电力系统、能源系统或优化理论基础的研究生、科研人员及工程技术人员,熟悉Matlab编程和基本优化工具(如Yalmip)。; 使用场景及目标:①用于学习和复现综合能源系统中考虑不确定性的优化调度与容量配置方法;②为含高比例可再生能源的微电网、区域能源系统规划设计提供模型参考和技术支持;③开展学术研究,如撰写论文、课题申报时的技术方案借鉴。; 阅读建议:建议结合文中提到的Matlab代码和网盘资料,先理解基础模型(如功率平衡、设备模型),再逐步深入不确定性建模与优化求解过程,注意区分鲁棒优化、随机优化与分布鲁棒优化的适用场景,并尝试复现关键案例以加深理解。
内容概要:本文系统分析了DesignData(设计数据)的存储结构,围绕其形态多元化、版本关联性强、读写特性差异化等核心特性,提出了灵活性、版本化、高效性、一致性和可扩展性五大设计原则。文章深入剖析了三类主流存储方案:关系型数据库适用于结构化元信息存储,具备强一致性与高效查询能力;文档型数据库适配半结构化数据,支持动态字段扩展与嵌套结构;对象存储结合元数据索引则有效应对非结构化大文件的存储需求,具备高扩展性与低成本优势。同时,文章从版本管理、性能优化和数据安全三个关键维度提出设计要点,建议采用全量与增量结合的版本策略、索引与缓存优化性能、并通过权限控制、MD5校验和备份机制保障数据安全。最后提出按数据形态分层存储的核心结论,并针对不同规模团队给出实践建议。; 适合人群:从事工业设计、UI/UX设计、工程设计等领域数字化系统开发的技术人员,以及负责设计数据管理系统架构设计的中高级工程师和系统架构师。; 使用场景及目标:①为设计数据管理系统选型提供依据,合理选择或组合使用关系型数据库、文档型数据库与对象存储;②构建支持版本追溯、高性能访问、安全可控的DesignData存储体系;③解决多用户协作、大文件存储、历史版本管理等实际业务挑战。; 阅读建议:此资源以实际应用场景为导向,结合具体数据库类型和表结构设计进行讲解,建议读者结合自身业务数据特征,对比分析不同存储方案的适用边界,并在系统设计中综合考虑成本、性能与可维护性之间的平衡。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值