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; } }
时间: 2024-10-05 06:38:38