這道題真是超級棒的stack DFS樣板題啊,在這裏給本身寫個小小的總結node
思路:
想到stack並不難,這種嵌套式通常是DFS的思想,先走到最裏面最小的那個括號,而後逐漸回到上一層→上一層。又∵非遞歸,「BFS queue, DFS stack」。想到用stack並不難
Stack non-recursion DFS template
要點是,處理完以後從新返回stack,纔可以回到上一層操做git
這個題具體操做起來真是不少可圈可點的地方,主要是在於String的處理上express
reverse
由於stack的順序,在這個題中須要每次將每層裏的內容reverse。直接StringBuilder的reverse方法不可取:由於是reverse每一層。e.g. 3[ab]2[c]層直接從stack取出其實是cc, ababab將這個reverse後應該獲得abababcc。這個時候考慮逆向stack,創建一個stack buffer,將stack pop出來的東西再reverse一個順序,逆逆得順app
instanceof
nstanceof是一個很好用的操做符,a instanceof A,判斷「一個對象是不是一個類的實例」。做爲操做符instanceof不能夠直接在最前面!取非(好比>=這種也是),而是用 a instanceof A == false之類的判斷ui
複製StringBuilder
add到底append幾回,怎麼append:直接append add 是不能夠的,由於add是在變的,必需要先將第一個add保存起來,相似於dummy node,預先保存queue size這種「錨定」。code
坑
當心一點0[peer], -3[aaa]這種狀況啊!對象
代碼
public class Solution {遞歸
public String expressionExpand(String s) { Stack<Object> stack = new Stack<>(); char[] arr = s.toCharArray(); int num = 0; for(char c : arr){ if(Character.isDigit(c)){ 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()); } 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);// reput } }
}it