Description
Given an expression s includes numbers, letters and brackets. Number represents the number of repetitions inside the brackets(can be a string or another expression).Please expand expression to be a string.
Examples
s = abc3[a] return abcaaa
s = 3[abc] return abcabcabc
s = 4[ac]dy, return acacacacdy
s = 3[2[ad]3[pf]]xyz, return adadpfpfpfadadpfpfpfadadpfpfpfxyz
我开始做的时候 想利用map<string,integer>
将[]里的字母 和前面的数字保存在map里。可是,写着写着。。突然想起来 map的key是不可以相同的。这个想法放弃。
之后利用stack.保存。然后遇到各种顺序错乱。。然后修改修再修改。。中间省略3小时。还是不行 ,没办法 百度。。于是就找到了这篇:网址https://segmentfault.com/a/1190000008883991。他说的几个坑 我全遇到了。
代码如下:
public class Solution {
/**
* @param s an expression includes numbers, letters and brackets
* @return a string
*/
public String expressionExpand(String s) {
// Write your code here
Stack<Object> stack = new Stack<>();
char[] arr = s.toCharArray();
int num = 0;
for(char c : arr){
if(Character.isDigit(c)){
//如果数字是 多位的 ,如23.
//开始num=0,所以执行后num=2.因为23是连起来的
//所以num=2*10+3=23.最后num=23
num = num * 10 + c - '0';
}
else if(c == '['){
stack.push(Integer.valueOf(num));
num = 0;
}
else if(c == ']'){
popStack(stack);
}
else{
stack.push(c);
}
}
popStack(stack);
return stack.pop().toString();
}
private void popStack(Stack<Object> stack){
StringBuilder add = new StringBuilder();
int count;
Stack<Object> buffer = new Stack<Object>();
while(!stack.isEmpty() && stack.peek() instanceof Integer == false){
buffer.push(stack.pop());
}
while(!buffer.isEmpty()){
add.append(buffer.pop());
}
//下面例子里xyz.那时stack是空的。所以只需要一次就行
count = stack.isEmpty()? 1 : (Integer) stack.pop();
StringBuilder part = new StringBuilder(add);
if(count > 0){
for(int i = 0; i < count - 1; i++)
add.append(part);
stack.push(add);
}
}
}
这里我以s="3[2[ad]3[pf]]xyz"
为例说明一下:
遇到’]’将stack里 数字之前的字母 pop给buffer.然后赋值给add.根据数字 来append字符串。