Expression Expand---lintcode

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字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值