import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @return string字符串
     */
    public String decodeCowName (String s) {
        // 用于存储数字
        Stack<String> stack1 = new Stack<>();
        // 用于存储字母
        Stack<String> stack2 = new Stack<>();
        char[] array = s.toCharArray();
        for (char c : array) {
            // 如果是数字直接push入栈
            if (c >= '0' && c <= '9') {
                stack1.push(c + "");
                // 如果是左括号也是直接入栈
            } 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

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