【Hot100】LeetCode—394. 字符串解码

目录


1- 思路

栈实现+四种情况处理

  • ① 遇到数字,进行倍数相加 、②遇到左括号,压栈之前的元素、③遇到右括号弹出,栈进行拼接、④否则遇到字母,直接拼接在 res
  • 通过栈,实现先进后出的思想

对于输入 3[a2[c]] 的输入,在读到 3[得到第一个括号 [ 之后才会进行入栈操作,也就是将之前的 3 入栈到一个 multi的栈中

    1. 定义一个 multi 变量用于存储倍数,也就是当前字符串扩大的倍数。
    1. 定义 res变量用于存储临时结果,如果读到的是字符,一直更新 res

读取过程

  • 读取数字:一开始如果读取的都是数字 multi,则对 multi*10 + c - '0'; 的方式
  • 读取字符:如果读取字符,暂存到 res 中,是否压栈取决于遇到的括号
  • 遇到 '[' 括号:如果遇到了左括号,则将 '[' 前状态的 数字 multi 和字符 res 进行压栈,之后重新更新 multires
  • 遇到 ']' 括号:如果遇到了右括号,则需要弹栈,进行处理

2- 实现

⭐++394. 字符串解码++------题解思路

java 复制代码
class Solution {
    public String decodeString(String s) {
        StringBuilder res = new StringBuilder();
        int multi = 0;
        // 两个栈
        Deque<Integer> stack_multi = new ArrayDeque<>();
        Deque<String> stack_str = new ArrayDeque<>();

        for(Character c: s.toCharArray()){
            //  0-9
            if( c>='0' && c<='9'){
                multi = multi*10 + c-'0';
            }else if(c == '['){
                stack_multi.push(multi);
                stack_str.push(res.toString());
                multi = 0;
                res = new StringBuilder();
            }else if(c == ']'){
                StringBuilder tmp = new StringBuilder();
                int curMulti = stack_multi.pop();
                for(int i = 0 ; i < curMulti;i++){
                    tmp.append(res);
                }
                res = new StringBuilder(stack_str.pop()).append(tmp);
            }else{
                res.append(c);
            }
        }
        return res.toString();
    }
}

3- ACM 实现

java 复制代码
public class strDecode {



    public static String strDecode(String str){
        // 1. 数据结构
        int multi = 0;
        StringBuffer res =  new StringBuffer();
        // 数字倍数
        Deque<Integer> stack_multi = new ArrayDeque<>();
        Deque<String> stack_res = new ArrayDeque<>();
        // 遍历字符串 str
        for(Character c : str.toCharArray()){
            // 如果是数字 更新倍数
            if( c>='0' && c<= '9'){
                multi = multi *10 + c - '0';
            }else if( c == '['){
                // 压栈
                stack_multi.push(multi);
                stack_res.push(res.toString());
                // 重置
                multi = 0;
                res = new StringBuffer();
            }else if(c==']'){
                // 出栈计算
                int nowMulti = stack_multi.pop();
                StringBuffer tmp = new StringBuffer();

                for(int i = 0 ; i < nowMulti;i++){
                    tmp = tmp.append(res);
                }

                res = new StringBuffer(stack_res.pop()).append(tmp);
            }else{
                res.append(c);
            }
        }
        return res.toString();
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        System.out.println("结果是"+strDecode(input));
    }
}

相关推荐
CoovallyAIHub13 分钟前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉
CoovallyAIHub1 小时前
英伟达ViPE重磅发布!解决3D感知难题,SLAM+深度学习完美融合(附带数据集下载地址)
深度学习·算法·计算机视觉
聚客AI18 小时前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
大怪v20 小时前
前端:人工智能?我也会啊!来个花活,😎😎😎“自动驾驶”整起!
前端·javascript·算法
惯导马工1 天前
【论文导读】ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and
深度学习·算法
骑自行车的码农1 天前
【React用到的一些算法】游标和栈
算法·react.js
博笙困了1 天前
AcWing学习——双指针算法
c++·算法
moonlifesudo1 天前
322:零钱兑换(三种方法)
算法
NAGNIP2 天前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队2 天前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法