【LintCode】Expression Expand 非遞歸stack完成DFS(String)

這道題真是超級棒的stack DFS樣板題啊,在這裏給本身寫個小小的總結node

思路:
想到stack並不難,這種嵌套式通常是DFS的思想,先走到最裏面最小的那個括號,而後逐漸回到上一層→上一層。又∵非遞歸,「BFS queue, DFS stack」。想到用stack並不難
Stack non-recursion DFS template
要點是,處理完以後從新返回stack,纔可以回到上一層操做git

這個題具體操做起來真是不少可圈可點的地方,主要是在於String的處理上express

  1. reverse
    由於stack的順序,在這個題中須要每次將每層裏的內容reverse。直接StringBuilder的reverse方法不可取:由於是reverse每一層。e.g. 3[ab]2[c]層直接從stack取出其實是cc, ababab將這個reverse後應該獲得abababcc。這個時候考慮逆向stack,創建一個stack buffer,將stack pop出來的東西再reverse一個順序,逆逆得順app

  2. instanceof
    nstanceof是一個很好用的操做符,a instanceof A,判斷「一個對象是不是一個類的實例」。做爲操做符instanceof不能夠直接在最前面!取非(好比>=這種也是),而是用 a instanceof A == false之類的判斷ui

  3. 複製StringBuilder
    add到底append幾回,怎麼append:直接append add 是不能夠的,由於add是在變的,必需要先將第一個add保存起來,相似於dummy node,預先保存queue size這種「錨定」。code


  4. 當心一點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

相關文章
相關標籤/搜索