【重点】【栈+特例】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
【电能质量扰动】基于ML和DWT的电能质量扰动分类方法研究(Matlab实现)内容概要:本文研究了一种基于机器学习(ML)和离散小波变换(DWT)的电能质量扰动分类方法,并提供了Matlab实现方案。首先利用DWT对电能质量信号进行多尺度分解,提取信号的时频域特征,有效捕捉电压暂降、暂升、中断、谐波、闪变等常见扰动的关键信息;随后结合机器学习分类器(如SVM、BP神经网络等)对提取的特征进行训练与分类,实现对不同类型扰动的自动识别与准确区分。该方法充分发挥DWT在信号去噪与特征提取方面的优势,结合ML强大的模式识别能力,提升了分类精度与鲁棒性,具有较强的实用价值。; 适合人群:电气工程、自动化、电力系统及其自动化等相关专业的研究生、科研人员及从事电能质量监测与分析的工程技术人员;具备一定的信号处理基础和Matlab编程能力者更佳。; 使用场景及目标:①应用于智能电网中的电能质量在线监测系统,实现扰动类型的自动识别;②作为高校或科研机构在信号处理、模式识别、电力系统分析等课程的教学案例或科研实验平台;③目标是提高电能质量扰动分类的准确性与效率,为后续的电能治理与设备保护提供决策依据。; 阅读建议:建议读者结合Matlab代码深入理解DWT的实现过程与特征提取步骤,重点关注小波基选择、分解层数设定及特征向量构造对分类性能的影响,并尝试对比不同机器学习模型的分类效果,以全面掌握该方法的核心技术要点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值