Leetcode - Decode String

My code:

public class Solution {
    public String decodeString(String s) {
        if (s == null || s.length() == 0) {
            return s;
        }
        
        Stack<Integer> count = new Stack<Integer>();
        Stack<String> result = new Stack<String>();
        
        int i = 0;
        result.push("");
        while (i < s.length()) {
            char curr = s.charAt(i);
            if (curr >= '0' && curr <= '9') {
                int j = i + 1;
                while (j < s.length() && s.charAt(j) >= '0' && s.charAt(j) <= '9') {
                    j++;
                }
                count.push(Integer.parseInt(s.substring(i, j)));
                i = j;
                continue;
            }
            else if (curr == '[') {
                result.push("");
            }
            else if (curr == ']') {
                String temp = result.pop();
                int number = count.pop();
                StringBuilder ret = new StringBuilder();
                for (int k = 0; k < number; k++) {
                    ret.append(temp);
                }
                
                result.push(result.pop() + ret.toString());
            }
            else {
                result.push(result.pop() + curr);
            }
            i++;
        }
        
        return result.pop();
    }
}

看答案写的。

reference:
https://discuss.leetcode.com/topic/57250/java-short-and-easy-understanding-solution-using-stack

还是很巧妙地,利用两个栈,把一个复杂的问题变得很有条理。
注意一个细节。
result 一开始 就压入了 一个 “”

我认为这个技巧很聪明。

result的定义是什么:
result.peek() 是当前位置下,上一层的string

所以当我们碰到 ‘]’

首先将这一层的string 拷贝多次,
然后,得把上一层的string pop 出来,和这个string连接,然后再压入栈中。
如果一开始不插一个 “”, 栈就会溢出。
这也是一开始我以为他肯定有bug的原因。

很巧妙。

Anyway, Good luck, Richardo! — 09/10/2016

    原文作者:Richardo92
    原文地址: https://www.jianshu.com/p/f4e867d7c768#comments
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞