解码字符串 Decode String

2018-11-14 17:56:12

问题描述:

问题求解:

方法一、递归求解

最直观的解法就是递归来求了,并且很显然的这个问题可以使用递归来进行求解。

    public String decodeString(String s) {
        StringBuffer sb = new StringBuffer();
        int num = 0;
        for (int i = 0; i < s.length(); i++) {
            if (Character.isDigit(s.charAt(i))) {
                num = 0;
                while (i < s.length() && Character.isDigit(s.charAt(i))) {
                    num = num * 10 + (s.charAt(i) - '0');
                    i++;
                }
                i--;
            }
            else if (s.charAt(i) == '[') {
                int count = 1;
                int j = i;
                while (count != 0) {
                    j++;
                    if (s.charAt(j) == '[') count++;
                    if (s.charAt(j) == ']') count--;
                }
                String tmp = decodeString(s.substring(i + 1, j));
                for (int k = 1; k < num; k++) sb.append(tmp);
                i = j;
            }
            else sb.append(s.charAt(i));
        }
        return sb.toString();
    }

方法二、使用Stack求解

使用Stack求解的时候,最核心的思路就是当遇到'['的时候将当前sb 和 num进行压栈操作,当遇到‘]’的时候将堆栈中sb 和 num取出并对当前的字符串进行num次重复并串联到sb后面。

    public String decodeString(String s) {
        StringBuffer sb = new StringBuffer();
        Stack<StringBuffer> stack1 = new Stack<>();
        Stack<Integer> stack2 = new Stack<>();
        int k = 0;
        for (char c : s.toCharArray()) {
            if (Character.isDigit(c)) k = k * 10 + c - '0';
            else if (c == '[') {
                stack1.push(sb);
                stack2.push(k);
                sb = new StringBuffer();
                k = 0;
            }
            else if (c == ']') {
                int count = stack2.pop();
                String tmp = sb.toString();
                sb = stack1.pop();
                for (int i = 0; i < count; i++) sb.append(tmp);
            }
            else sb.append(c);
        }
        return sb.toString();
    }

 

posted @ 2018-11-14 18:03  hyserendipity  阅读(737)  评论(0编辑  收藏  举报