当前位置: 首页 > article >正文

leetcode hot100【LeetCode 394.字符串解码】java实现

LeetCode 394.字符串解码

题目描述

给定一个经过编码的字符串,编码规则为 k[encoded_string],其中 encoded_string 中的每个字符都会重复 k 次。编写一个函数来解码这个字符串。

示例 1:

输入:s = "3[a]2[bc]", 返回 "aaabcbc".

示例 2:

输入:"3[a2[c]]", 返回 "accaccacc".

示例 3:

"2[abc]3[cd]ef", 返回 "abcabccdcdcdef".

示例 4:

"abc3[cd]xyz", 返回 "abccdcdcdxyz".

Java 实现代码

class Solution {
    public String decodeString(String s) {
        Stack<Integer> countStack = new Stack<>();
        Stack<StringBuilder> resultStack = new Stack<>();
        StringBuilder current = new StringBuilder();
        int k = 0;

        for (char ch : s.toCharArray()) {
            if (Character.isDigit(ch)) {
                // 处理连续数字
                k = k * 10 + (ch - '0');
            } else if (ch == '[') {
                // 遇到 '[',将当前结果和倍数压栈
                countStack.push(k);
                resultStack.push(current);
                // 重置 k 和 current
                k = 0;
                current = new StringBuilder();
            } else if (ch == ']') {
                // 遇到 ']',从栈中弹出倍数和之前的字符串
                int repeatTimes = countStack.pop();
                StringBuilder decoded = resultStack.pop();
                // 将当前字符串重复 repeatTimes 次后附加回去
                for (int i = 0; i < repeatTimes; i++) {
                    decoded.append(current);
                }
                current = decoded;
            } else {
                // 处理普通字符
                current.append(ch);
            }
        }
        return current.toString();
    }
}

解题思路

这个问题可以通过使用栈来解决。我们遍历字符串,使用一个栈来存储中间结果,以及一个计数器来记录数字。当遇到 [ 时,我们将当前的字符串和数字压入栈中,并重置计数器和当前字符串。当遇到 ] 时,我们从栈中弹出数字和之前的字符串,并将当前字符串重复相应的次数,并与之前的字符串拼接。最后,返回栈顶的字符串。

复杂度分析

  • 时间复杂度:O(N),其中 N 是字符串 s 的长度。因为我们需要遍历字符串中的每个字符。
  • 空间复杂度:O(N),在最坏的情况下,我们可能需要将整个字符串存储在栈中。

http://www.kler.cn/a/369917.html

相关文章:

  • Dify:低代码 AI 应用开发平台详解与实战指南
  • 《CPython Internals》阅读笔记:p336-p352
  • css粘性定位超出指定宽度失效问题
  • Trimble三维激光扫描-地下公共设施维护的新途径【沪敖3D】
  • 逐笔成交逐笔委托Level2高频数据下载和分析:20250122
  • SQL-leetcode—1141. 查询近30天活跃用户数
  • Shein注册不了的常见原因及解决方法
  • Java知识巩固(十二)
  • 蚁群算法(Ant Colony Optimization)详细解读
  • Flink系列之:学习理解通过状态快照实现容错
  • matlab 绘图操作
  • Rust教程
  • 初探Servlet
  • picomax的rkipc开启rtmp功能
  • Python 基础语法 - 变量
  • 快速学会C 语言基本概念和语法结构
  • 电脑技巧:如何进行磁盘测速?
  • 模型 五遍沟通法(企业管理)
  • 【Gaussian Grouping: Segment and Edit Anything in 3D Scenes】阅读笔记
  • Java最全面试题->数据库/中间件->KafKa面试题
  • matlab实现了基于移动可变形组件(Moving Morphable Components,MMC)的拓扑优化算法
  • svg 初识+了解 + 应用 + 动画
  • Java识别图片或扫描PDF中的文字
  • [NewStar 2024] week4
  • 微机原理与接口技术—— 总线形成(2)
  • Flutter升级与降级