【Leetcode 热题 100】394. 字符串解码

问题背景

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

编码规则为: k [ e n c o d e d _ s t r i n g ] k[encoded\_string] k[encoded_string],表示其中方括号内部的 e n c o d e d _ s t r i n g encoded\_string encoded_string 正好重复 k k k 次。注意 k k k 保证为正整数。

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

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

数据约束

  • 1 ≤ s . l e n g t h ≤ 30 1 \le s.length \le 30 1≤s.length≤30
  • s s s 由小写英文字母、数字和方括号 '[]' 组成
  • s s s 保证是一个 有效 的输入
  • s s s 中所有整数的取值范围为 [ 1 , 300 ] [1, 300] [1,300]

解题过程

这题标签是中等,但还是比较复杂的。

从一般的思路来说,它是一个从里到外的过程。

因为有可能出现嵌套使用 k [ e n c o d e d _ s t r i n g ] k[encoded\_string] k[encoded_string] 这个规则的可能,所以有必将已经完成解析的字符串记录到栈中。

在这个基础上,遇到不同的字符进行相应的处理即可。

具体实现

java 复制代码
class Solution {
    public String decodeString(String s) {
        // 定义两个栈,一个用来记录系数,一个用来记录已经完成解析的字符串
        Deque<Integer> integerStack = new ArrayDeque<>();
        Deque<String> stringStack = new ArrayDeque<>();
        int times = 0;
        StringBuilder stringBuilder = new StringBuilder();
        for(char c : s.toCharArray()) {
            // 在当前处理过程中,按数位顺序计算系数
            if(Character.isDigit(c)) {
                times = times * 10 + c - '0';
            }
            // 遇到左括号,将当前的字符串记录到栈中
            if(c == '[') {
                integerStack.push(times);
                times = 0;
                stringStack.push(stringBuilder.toString());
                stringBuilder.setLength(0);
            }
            // 遇到右括号,根据题意重复字符串,并对当前处理的字符串进行更新
            if(c == ']') {
                StringBuilder cur = new StringBuilder();
                int curTimes = integerStack.pop();
                for(int i = 0; i < curTimes; i++) {
                    cur.append(stringBuilder);
                }
                stringBuilder = new StringBuilder(stringStack.pop() + cur);
            }
            // 在当前处理过程中,英文字母直接添加到末尾
            if(Character.isLetter(c)) {
                stringBuilder.append(c);
            }
        }
        return stringBuilder.toString();
    }
}
相关推荐
熬了夜的程序员1 天前
【LeetCode】69. x 的平方根
开发语言·算法·leetcode·职场和发展·动态规划
Niuguangshuo1 天前
音频特征提取算法介绍
算法·音视频
Vect__1 天前
从底层到上层的“外挂”:deque、stack、queue、priority_queue 全面拆解
数据结构·c++
fengfuyao9851 天前
基于MATLAB的匈牙利算法实现任务分配
算法·数学建模·matlab
CoovallyAIHub1 天前
超详细链式插补 (MICE) 多元插补:机器学习模型的高级缺失数据处理
算法·机器学习·计算机视觉
明天会有多晴朗1 天前
C语言入门教程(第6讲):函数——让程序学会“分工合作”的魔法
c语言·开发语言·算法
玖釉-1 天前
三维模型数据结构与存储方式解析
数据结构·算法·图形渲染
草莓熊Lotso1 天前
《算法闯关指南:优选算法--二分查找》--17.二分查找(附二分查找算法简介),18. 在排序数组中查找元素的第一个和最后一个位置
开发语言·c++·算法
努力努力再努力wz1 天前
【C++进阶系列】:万字详解特殊类以及设计模式
java·linux·运维·开发语言·数据结构·c++·设计模式
泽虞1 天前
《Qt应用开发》笔记p4
linux·开发语言·数据库·c++·笔记·qt·算法