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

相关推荐
Felven10 分钟前
A. Ideal Generator
java·数据结构·算法
MoonBit月兔39 分钟前
双周报Vol.70: 运算符重载语义变化、String API 改动、IDE Markdown 格式支持优化...多项更新升级!
ide·算法·哈希算法
How_doyou_do43 分钟前
树状数组底层逻辑探讨 / 模版代码-P3374-P3368
数据结构·算法·树状数组
小鹿鹿啊1 小时前
C语言编程--14.电话号码的字母组合
c语言·开发语言·算法
小O的算法实验室1 小时前
2024年ESWA SCI1区TOP:量子计算蜣螂算法QHDBO,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
C语言魔术师1 小时前
509. 斐波那契数
算法·动态规划
共享家95272 小时前
栈相关算法题解题思路与代码实现分享
c++·leetcode
Wendy_robot2 小时前
【前缀和计算和+哈希表查找次数】Leetcode 560. 和为 K 的子数组
c++·算法·leetcode
o独酌o2 小时前
算法习题-力扣446周赛题解
算法·leetcode
一只鱼^_2 小时前
第十六届蓝桥杯大赛软件赛省赛 C/C++ 大学B组 [京津冀]
c语言·数据结构·c++·算法·贪心算法·蓝桥杯·动态规划