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

发布于:2024-09-19 ⋅ 阅读:(120) ⋅ 点赞:(0)


1- 思路

栈实现+四种情况处理

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

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

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

读取过程

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


2- 实现

394. 字符串解码——题解思路

在这里插入图片描述

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 实现

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


网站公告

今日签到

点亮在社区的每一天
去签到