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

相关推荐
cynicme16 小时前
力扣3228——将 1 移动到末尾的最大操作次数
算法·leetcode
熬了夜的程序员16 小时前
【LeetCode】109. 有序链表转换二叉搜索树
数据结构·算法·leetcode·链表·职场和发展·深度优先
随意起个昵称16 小时前
【递归】二进制字符串中的第K位
c++·算法
mjhcsp17 小时前
C++ 循环结构:控制程序重复执行的核心机制
开发语言·c++·算法
立志成为大牛的小牛17 小时前
数据结构——四十一、分块查找(索引顺序查找)(王道408)
数据结构·学习·程序人生·考研·算法
xier_ran17 小时前
深度学习:RMSprop 优化算法详解
人工智能·深度学习·算法
地平线开发者17 小时前
不同传感器前中后融合方案简介
算法·自动驾驶
地平线开发者17 小时前
征程 6X 常见 kernel panic 问题
算法·自动驾驶
com_4sapi19 小时前
2025 权威认证头部矩阵系统全景对比发布 双榜单交叉验证
大数据·c语言·人工智能·算法·矩阵·机器人
前端小L19 小时前
二分查找专题(九):“降维”的魔术!将二维矩阵“拉平”为一维
数据结构·算法