394. 字符串解码【中等】

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a2[4] 的输入。

测试用例保证输出的长度不会超过 105

示例 1:

复制代码
输入:s = "3[a]2[bc]"
输出:"aaabcbc"

示例 2:

复制代码
输入:s = "3[a2[c]]"
输出:"accaccacc"

示例 3:

复制代码
输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"

示例 4:

复制代码
输入:s = "abc3[cd]xyz"
输出:"abccdcdcdxyz"

一、栈

思路:

定义两个栈,把数字和字符压入不同的栈,通过判断 来入栈出栈。注意,StringBuilder 在栈中也可以添加元素,栈中存的是引用地址。数字栈并不连续,每次只存这次的数字。但字符栈是连续的,每次都保留上次的字符,并拼接上这次的字符,字符栈中压入的是上一次遇到 ] 的字符,然后这次的字符放在currentString ,在用字符栈中弹出的字符 append 上 n * currentString 。

时间复杂度O(n)

代码:

java 复制代码
class Solution {
    public String decodeString(String s) {
        Stack<Integer> countStack = new Stack<>();
        Stack<StringBuilder> stringStack = new Stack<>();
        StringBuilder currentString = new StringBuilder();
        int countSum = 0;

        // 数字栈并不连续,每次只存这次的数字。
        // 但字符栈是连续的,每次都保留上次的字符,并拼接上这次的字符,字符栈中压入的是上一次遇到 ] 的字符,然后这次的字符放在currentString ,在用字符栈中弹出上次的字符 append 上 n * currentString 。
        for(char c : s.toCharArray()){
            if(Character.isDigit(c)){
                countSum = countSum * 10 + (c - '0');
            }else if(c == '['){
                countStack.push(countSum);
                stringStack.push(currentString);

                countSum = 0;
                currentString = new StringBuilder();
            }else if(c == ']'){
                int repeatNum = countStack.pop();
                StringBuilder decdoeString = stringStack.pop();

                for(int i = 0; i < repeatNum; i++){
                    decdoeString.append(currentString);
                }
                currentString = decdoeString;
            }else{
                currentString.append(c);
            }
        }
        return currentString.toString();
    }
}
相关推荐
黑马程序员毕设7 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳7 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
心抵鹊8 小时前
归并排序之翻转对(hard)
数据结构·算法
白山编程大哥8 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
devpotato8 小时前
缓存与数据库更新顺序不一致问题
java·数据库·redis
shehuiyuelaiyuehao8 小时前
算法34,位运算符操作,总结
算法
xcl09258 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·spring boot·需求分析
Navigator_Z8 小时前
LeetCode //C - 1224. Maximum Equal Frequency
c语言·算法·leetcode
Kyrie_kk8 小时前
Java--IO--Path文件访问
java·后端
qinqinzqq8 小时前
Maven POM 格式、Schema 与 XSD:一篇讲透
java·maven