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.
Have you met this question in a real interview?
Example
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
Challenge
Can you do it without recursion?
lint code:
这道题可以使用stack 或者递归来实现
我首先选择的是stack, 以后补上递归的写法
其实是考察细节的实现,只要按照例子跑一遍基本上就知道怎么实现了
这段程序里的
- tempRes
- sb
- tempBuffer
作用都是不一样的,在实现的时候还是会被自己坑到,真的是起变量名要注意
tempRes保存的是当前遇到 “]” 时候,把stack里保存的string加上当前sb里剩余的string全部取出来,用来乘以 numOfTimes, 做乘法.
tempBuffer的所用是每次把stack中的string,插入到0为index的位置,因为stack是先进后出的,我们需要维持正确的顺序,需要每次向头插入,而不是使用append()
其他的就还好了.
public class Solution {
/**
* @param s: an expression includes numbers, letters and brackets
* @return: a string
*/
public String expressionExpand(String s) {
// write your code here
// use only one stack to stack numbers and strings
int number=0;
StringBuffer sb = new StringBuffer();
Stack<Object> stack = new Stack<>();
for(int i=0;i<s.length();i++) {
// if digit
if(Character.isDigit(s.charAt(i))) {
// check if cur sb buffer
if(sb.length()>0) {
stack.add(sb.toString());
sb = new StringBuffer();
}
number = number * 10 + (s.charAt(i) - '0');
} else if(s.charAt(i) == '[') {
// stack current number
stack.add(number);
number = 0;
} else if(s.charAt(i) == ']') {
// pop up a stack, until there meets a number
StringBuffer tempBuffer = new StringBuffer();
while(stack.peek() instanceof String) {
System.out.println("str from stack:" + stack.peek());
tempBuffer.insert(0, (String) stack.pop());
}
tempBuffer.append(sb.toString());// append current strings
int numOfTimes = (int) stack.pop();
String tempRes = "";
for(int j=0;j<numOfTimes;j++) {
tempRes += tempBuffer;
}
stack.add(tempRes);
sb = new StringBuffer();
} else if(Character.isLetter(s.charAt(i))) {
sb.append(s.charAt(i));
}
}
StringBuffer res = new StringBuffer();
while(stack.size()>0) {
res.insert(0, stack.pop());
}
if(sb.length()>0) {
res.append(sb.toString());
}
return res.toString();
}
}