【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

相关文章
相关标签/搜索