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.如果遇到单个字符,直接拼接到子字符串