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

目录


1- 思路

栈实现+四种情况处理

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

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

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

读取过程

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

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));
    }
}

相关推荐
hetao17338375 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
Zootopia6266 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan6 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
2601_960356387 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
h_a_o777oah7 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO97 小时前
指针的算术运算详解
java·数据结构·算法
Coder-magician7 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
垆边人似月.7 小时前
VLAN 资源池(100~200 分档)
数据结构·算法
潼心1412o8 小时前
C++初阶(长期更新)第6讲:类和对象(下)
开发语言·c++·算法
星光开发者9 小时前
基于决策树随机森林算法的小说推荐系统的设计与实现-计算机毕设【课程设计】78485
vue.js·算法·微信小程序·django·php·课程设计·express