【Leetcode】字符串解码

思路:

(1)借助Stack,遇到’]'出栈,往前扫描,记录子串:“数字[字母]”;
(2)子串翻倍处理,处理完毕再入栈,栈中从低到高的顺序,就是答案的顺序;
(3)借助StringBuilder,显示处理完毕的字符串;

代码:

    public String decodeString(String s) {
        if(s.length() == 0)
    		return s;
    	
        char[] ch = s.toCharArray();
        Stack<Character> stack = new Stack<>();
        ArrayList<Character> tmpList = new ArrayList<>();	// 操作局部字符串
        
        int i, j, num, k;

        for(i = 0; i<s.length(); i++){
        	stack.push(ch[i]);
        	
    		if(stack.peek() == ']') { 			// 处理局部字符串,局部出栈再入栈
    			stack.pop(); 					// ']'出栈
    			while(stack.peek() != '['){ 
    				tmpList.add(stack.pop());	//	字母出栈并记录, tmpList中为逆序
    			}
    			
        		stack.pop();					// '['出栈
                num = 0;						// 记录数字
        		k = 0;
        		// 从左往右,将字符拼装成数字
    			while(!stack.isEmpty() && stack.peek() >= '0' && stack.peek() <= '9') {
        			num = (int) ((stack.pop() - '0') * Math.pow(10, k) + num);
        			k++;
    			}
        			
    			while(num != 0){				// n倍字母
    				for(j = tmpList.size()-1; j>=0 ;j--)  // 再逆序入栈,
    					stack.push(tmpList.get(j));
    				num--;
    			}
    		}
    		
    		tmpList.clear();
    	}

    	StringBuilder sb = new StringBuilder();
        for(j = 0; j < stack.size(); j++)
        	sb.append(stack.elementAt(j));
        
    	return sb.toString();
    }

复杂度分析:

Time:O(N)
Space:O(N)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值