栈-N394-字符串解码

题目

  • 概述:给定一个经过编码的字符串,返回它解码后的字符串,编码规则为:k[encoded_string],表示其中方括号内部的encoded_string正好重复k次,k为正整数

    输入字符串总是有效的

    如果没有括号就不会出现数字

    括号里面内容不会包含数字

  • 出处:https://leetcode-cn.com/problems/decode-string/

思路

  • 由于字符串可以是有括号嵌套的,那么需要保存嵌套前的数据,所以考虑用栈实现

  • 遍历字符串:

    1. 若一直出现数字,则将数字持续拼接直到字符串遍历结束或遇到非数字字符,将拼接后的数字字符串放入栈中
    2. 若出现'[',则将"["放入栈中
    3. 若出现除数字或括号外的字符,则将其持续拼接直到字符串遍历结束或遇到数字或']',将拼接后得到得字符串放入栈中
    4. 若出现']',则出栈3次,将第一次出栈的字符串重复k次并拼接起来再放入栈中,k为第三次出栈得到的数字字符串
    5. 若出现']',则将出栈的字符串依次拼接,直至遇到"[",将"["出栈,再出栈一次得到编码次数k,将拼接的字符串重复k次后再拼接放入栈中
  • 最后将栈中元素依次出栈并逆序拼接,得到解码后的字符串

代码

class Solution {
    public String decodeString(String s) {
        LinkedList stack = new LinkedList<>();
        StringBuilder digitTemp = new StringBuilder();
        StringBuilder strTemp = new StringBuilder();
        StringBuilder temp = new StringBuilder();
        String encodeStr;
        int encodeNumber;
        
        for (char c : s.toCharArray()) {
            switch (c) {
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                    if (strTemp.length() > 0) {
                        stack.push(strTemp.toString());
                        strTemp = new StringBuilder();
                    }
                    digitTemp.append(c);
                    break;
                case '[':
                    if (digitTemp.length() > 0) {
                        stack.push(digitTemp.toString());
                        digitTemp = new StringBuilder();
                    }
                    stack.push("[");
                    break;
                case ']':
                    while (!"[".equals(stack.peek())) {
                        strTemp.insert(0, stack.pop());
                    }
                    stack.pop();
                    encodeStr = strTemp.toString();
                    strTemp = new StringBuilder();
                    encodeNumber = Integer.parseInt(stack.pop());
                    for (int i = 0; i < encodeNumber; ++i) {
                        temp.append(encodeStr);
                    }
                    stack.push(temp.toString());
                    temp = new StringBuilder();
                    break;
                default:
                    strTemp.append(c);
                    break;
            }
        }
        
        if (digitTemp.length() > 0) {
            temp.append(digitTemp);
        }
        
        if (strTemp.length() > 0) {
            temp.append(strTemp);
        }
        
        while (!stack.isEmpty()) {
            temp.insert(0, stack.pop());
        }
        
        return temp.toString();
    }
}

你可能感兴趣的:(栈-N394-字符串解码)