import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
     public String decodeStrin(String s) {
        Stack<Integer> numStack = new Stack<>(); // 用于存放重复次数的栈
        Stack<String> strStack = new Stack<>(); // 用于存放子字符串的栈
        String currStr = ""; // 当前处理的子字符串
        int currNum = 0; // 当前的重复次数
        for (char c : s.toCharArray()) {
            if (Character.isDigit(c)) { // 如果是数字字符
                currNum = (c - '0'); // 计算重复次数
            } else if (c == '{') { // 如果是左括号
                numStack.push(currNum); // 将当前的重复次数入栈
                strStack.push(currStr); // 将当前的子字符串入栈
                currNum = 0; // 重置重复次数
                currStr = ""; // 重置子字符串
            } else if (c == '}') { // 如果是右括号
                String tmp = currStr; // 备份当前子字符串
                for (int i = 1; i < numStack.peek(); i++) { // 根据重复次数进行拼接
                    currStr += tmp;
                }
                numStack.pop(); // 弹出栈顶的重复次数
                currStr = strStack.peek() + currStr; // 将当前子字符串与栈顶的子字符串拼接
                strStack.pop(); // 弹出栈顶的子字符串
            } else {
                currStr += c; // 非括号字符直接拼接到当前子字符串
            }
        }

        return currStr; // 返回最终的解码结果
    }
}

本题知识点分析:

1.栈的出栈和入栈

2.数学模拟

3.字符串拼接

本题解题思路分析:

1.遇到数字,计算重复次数

2.遇到左括号,此时放入重复次数的数字和子字符串,然后重置为0和空字符串

3.遇到右括号,计算重复次数,然后拼接字符串,将当前子字符串和栈顶的字符串进行连接,然后分别对数字和字符串出栈。

4.如果遇到单个字符,直接拼接到子字符串

本题使用编程语言: Java