首页 > 代码库 > java代码按照指定格式解压缩字符串

java代码按照指定格式解压缩字符串

import java.util.Stack;
// deHong hongJu oldJiang dP
public class RedChrysanthemum {
    private static String result = "";
    private static Stack<String> stack = new Stack<>();

    public static void main(String[] args) {
        //"4[b]3[ac]" 解压缩后为"bbbbacacac"
        // "2[d3[c]]" 解压缩后为 "dcccdccc"
        String str = "ef10[d3[cc]]";

       System.out.print(process(str));
    }

    private static String process(String str) {
        String in, out;
        int length = str.length();
        for (int i = 0; i < length; i++) {
            in = String.valueOf(str.charAt(i));
            // 不等于右括号的都进栈
            if (!in.equals("]")) {
                stack.push(in);
            } else {
                String tmpStr = "";
                String tar = "";
                out = stack.pop();
                // 待出栈的都是[字母数字,拿到数字拼上,蹦出一个,然后去下面的循环。
                // 如果连续多个字母,就会继续走这个循环,数字走下面。
                while (!out.equals("[")) {
                    tmpStr = out + tmpStr;
                    // pop出来一个,继续判断,是字母就再pop
                    out = stack.pop();
                }

                // 取数字 2[d3[c]]
                String numStr = "";
                while (stack.peek().charAt(0) >= ‘0‘ && stack.peek().charAt(0) <= ‘9‘) {
                    // 访问栈顶,是数字就拼接上,然后蹦走一个。
                    numStr = stack.peek() + numStr;
                    stack.pop();
                    if (stack.isEmpty()) {
                        break;
                    }
                }
                // 拿到左中括号左侧的数字
                int num = Integer.parseInt(numStr);
                for (int j = 0; j < num; j++) {
                    tar = tar + tmpStr;
                }
                stack.push(tar);
            }
        }

        while (stack.size() > 0) {
            String finalStr = stack.pop();
            result = finalStr + result;
        }
        return result;
    }
}

 

java代码按照指定格式解压缩字符串