leetcode394 字符串解码
这道题比较直观的联想到使用栈来处理,我的思路是:
遍历字符串,从左往右依次入栈,遇到能合并的先合并然后加入栈
比如232[asc]33[ass]
先把232、asc、33、ass拼成一个字符串加入栈中
遇到一个右括号就开始往外弹,至于弹多少个元素判断栈顶是不是左括号
如果当前栈顶是左括号,我们需要弹出两次栈,取出需要增加多少倍的那个数字,代码写的比较简单,应该挺好理解
public static String decodeString(String s) {
String res = "";
Stack<String> stack = new Stack<>();//使用栈存储数据
for (int i = 0; i < s.length(); i++) {
String middle = s.substring(i, i + 1);//没有用字节,因为用字节判断如果遇到数字是97这种很麻烦
if (middle.matches("[0-9]")) { //正则表达式匹配,先判断当前是否为数字
String num = middle;
while (i + 1 < s.length() && s.substring(i + 1, i + 2).matches("[0-9]")) {//判断是不是个连续的数
num += s.substring(i + 1, i + 2);
i++;
}
stack.add(num);//把这个数加入栈
} else if (middle.matches("[a-z]") || middle.equals("[") || middle.matches("[A-Z]")) {//使用正则表达式判断字母
if (middle.equals("["))
stack.add(middle);
else {
String ele = middle;
while (i + 1 < s.length() && s.substring(i + 1, i + 2).matches("[a-z]") ||
i + 1 < s.length() && s.substring(i + 1, i + 2).matches("[A-Z]")) {//判断是不是个连续的字母
ele += s.substring(i + 1, i + 2);
i++;
}
stack.add(ele);//把这个字母串加入栈
}
} else if (middle.equals("]")) {//遇到右括号开始往外弹
String temp = "";//中间变量
while (!stack.peek().equals("["))//把下一个左括号之前的都弹出来做字符串拼接
temp = stack.pop()+temp;
stack.pop();//这个弹的是左括号
int count = Integer.parseInt(stack.pop());//这个弹的是数
String mid = temp;
for (int j = 0; j < count - 1; j++) {//这一步是把字符串重复那个数的次数
temp += mid;
}
stack.add(temp);//再放回栈中
}
}
while (!stack.empty()) { //最后把栈里的东西倒出来
String middle2 = "";
middle2 = stack.pop() + middle2;
res = middle2 + res;
}
return res;
}