美文网首页
栈-N394-字符串解码

栈-N394-字符串解码

作者: 三次元蚂蚁 | 来源:发表于2019-04-08 12:26 被阅读0次

    题目

    • 概述:给定一个经过编码的字符串,返回它解码后的字符串,编码规则为: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<String> 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-字符串解码

          本文链接:https://www.haomeiwen.com/subject/nnsuiqtx.html