import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
    public String decodeString (String s) {
        // 用于存储数字
        Stack<String> stack1=new Stack<>();
        // 用于存储字母
        Stack<String> stack2=new Stack<>();
        char[] array = s.toCharArray();
        for(char c:array){
            // 如果是数字直接push入栈1
            if(c>='0' && c<='9'){
                stack1.push(c+"");
                // 如果是左括号或者字母也是直接入栈2
            } else if(c=='[' || c>='a' && c<='z'){
                stack2.push(c+"");
                // 右括号需要做逻辑操作
            } else if(c==']'){
                StringBuilder tmp1=new StringBuilder();
                // 如果字母栈还有字母
                while(!stack2.isEmpty()){
                    String x=stack2.pop();
                    // 如果没有遇到左括号,表明一组括号内字母还没输出完毕
                    if(!x.equals("[")){
                        // 直接加入到StringBuilder,单线程最快 保证字母顺序
                        tmp1.insert(0,x);
                    } else {
                        break;
                    }
                }
                // 循环多少次每组字母
                int count=Integer.parseInt(stack1.pop());
                StringBuilder tmp2=new StringBuilder();
                while(count>0){
                    tmp2.append(new String(tmp1));
                    count--;
                }
                stack2.push(new String(tmp2));
            }
        }
        // 查询是否还有字母,都加入到结果集中
        StringBuilder result=new StringBuilder();
        while(!stack2.isEmpty()){
            result.insert(0, stack2.pop());
        }
        return result.toString();
    }
}

本题知识点分析:

1.栈的出栈和入栈

2.字符串StringBuilder使用

3.数学模拟

本题解题思路分析:

1.遇到数字入栈1

2.遇到左括号或者小写字母入栈2

3.为什么要左括号入栈二,自己想要逻辑就可以了,左括号和右括号要组成一个封闭区间

4.要考虑括号嵌套括号的情况,这个点很重要

5.其他就是用StringBuilder进行字符串拼接,注意字母顺序别搞错了就行,API函数的方法掌握清楚

本题使用编程语言: Java

如果你觉得本篇文章对您有帮助的话,可以点个赞支持一下,感谢~