【LeetCode】【算法】394. 字符串解码

devtools/2024/11/7 8:28:16/

LeetCode 394. 字符串解码

题目描述

给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

思路

思路:参考的题解字符串解码(辅助栈法 / 递归法,清晰图解)
在这个题解中的变量包括res临时存储字符串,multi临时存储数值,stack_multi作为辅助栈存储数值,stack_res作为辅助栈存储字符串,在这个算法中,规则为:

  1. 假如遇到了数字,更新multi=10*multi+Integer.parse(c+””);
  2. 假如遇到了字符,更新res=res.append(c)
  3. 假如遇到了[,将multires中的内容入栈:multi.push(multi), res.push(res)并做清空multi=0, res=new StringBuilder()
  4. 假如遇到了],将stack_multistack_res中的内容出栈,得到目前的结果写入res中。实际上就是res=last_res+last_multi*res,即有:
    I. Integer m = stack_multi.pop(); String r = stack_res.pop()
    II. 根据值m和当前res中的内容,利用for循环组成字符串for(int i=0;i<m;i++) tmp.append(res)
    III. res=r+tmp

代码

class Solution {public String decodeString(String s) {StringBuilder res = new StringBuilder();int multi = 0;// 两个辅助栈,一个存数字,一个存字符串Deque<Integer> stack_multi = new ArrayDeque<>();Deque<String> stack_res = new ArrayDeque<>();for (char c : s.toCharArray()) {if (c == '['){ // 如果等于左括号,将res和multi入栈中stack_multi.push(multi);stack_res.push(res.toString());multi = 0;res = new StringBuilder();} else if (c == ']') { // 如果等于右括号,当前结果=last_res+last_multi*resInteger last_multi = stack_multi.pop();String last_res = stack_res.pop();StringBuilder tmp = new StringBuilder();for (int i = 0; i < last_multi; i++) tmp.append(res);res = new StringBuilder(last_res + tmp);}else if (c >= '0' && c <= '9') multi = multi * 10 + Integer.parseInt(c + "");else res.append(c);}return res.toString();}
}

http://www.ppmy.cn/devtools/131961.html

相关文章

【数据结构】树-二叉树-堆(下)

&#x1f343; 如果觉得本系列文章内容还不错&#xff0c;欢迎订阅&#x1f6a9; &#x1f38a;个人主页:小编的个人主页 &#x1f380; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 ✌️ &#x1f91e; &#x1f91f; &#x1f918; &#x1f919; &#x1f448; &…

Renesas R7FA8D1BH (Cortex®-M85) Flash的功能介绍

目录 概述 1 Flash的功能介绍 1.1 功能特征 1.2 时钟配置 1.3 注意点 2 使用方法介绍 2.1 BGO 操作注意事项 2.2 代码Flash注意事项 2.3 Flash时钟&#xff08;FCLK&#xff09; 2.4 中断 2.5 注意点 2.6 Flash应用的限制 3 应用函数接口 3.1 R_FLASH_HP_Open() …

反序列化失败问题

关于ROS2&#xff08;Robot Operating System 2&#xff09;中的反序列化失败问题&#xff0c;通常这个问题可能出现在订阅端&#xff0c;因为反序列化是指将接收到的数据流转换成数据结构&#xff0c;例如对象。如果订阅端接收到的数据格式与预期不符&#xff0c;或者使用的反…

Array.prototype.map()的用法和手写

1.Array.prototype.map()的基本使用 Array.prototype.map() 是 JavaScript 中数组的原型方法之一&#xff0c;用于对数组中的每个元素执行指定的操作&#xff0c;并返回操作结果组成的新数组。它的基本语法如下&#xff1a; const newArray array.map(callback(element,inde…

Tomcat 启动卡住,日志显示 At least one JAR was scanned for TLDs yet contained no TLDs.

现象 Tomcat 启动后&#xff0c;控制台输出卡在了&#xff1a; At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JA…

主流OLAP对比

参考 主流大数据OLAP框架对比 分类 按照架构实现划分&#xff1a; MPP 架构系统&#xff1a;Presto、Impala、Doris、Clickhouse、Spark SQL、Flink SQL…&#xff0c;这种架构主要还是从查询引擎入手&#xff0c;使用分布式查询引擎。搜索引擎架构的系统&#xff1a;es。预计…

udp丢包问题

udp或者tcp丢包问题监测方式&#xff1a; netstat -su 问题分析&#xff1a; 1. 内存 2. cpu 3. 发送接收缓存 动画图解 socket 缓冲区的那些事儿-CSDN博客

Python自动化运维的未来趋势

Python自动化运维的未来趋势 目录 &#x1f916; AIOps的概念与实践&#xff1a;自动化与智能化的未来&#x1f9e0; 人工智能在运维中的潜力与应用&#xff1a;革新运维操作&#x1f310; 新兴技术&#xff08;如边缘计算&#xff09;对运维的影响&#xff1a;技术变革下的新…