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

栈----3.字符串解码

394. 字符串解码 - 力扣(LeetCode)

/**

        k[encoded_string] ---> k个连续的s; encoded_string = k[encoded_string](可嵌套)

        解码规则:

                1.将所有字符压入栈中,直到遇到']' ---> 当前层级的encoded_string读取完毕,开始转换

                2.弹出栈,将弹出的元素拼接,直到遇到'[' ---> 当前层级的encoded_string转化完毕

                3.继续弹出直到栈顶元素不为数字,k读取完毕,重复拼接k次重新入栈 ---> 当前k[encoded_string]转码完毕

                4.继续读取字符串,重复上述流程直到转换完毕为止

*/

class Solution {/**k[encoded_string] ---> k个连续的s; encoded_string = k[encoded_string](可嵌套)解码规则:1.将所有字符压入栈中,直到遇到']' ---> 当前层级的encoded_string读取完毕,开始转换2.弹出栈,将弹出的元素拼接,直到遇到'[' ---> 当前层级的encoded_string转化完毕3.继续弹出直到栈顶元素不为数字,k读取完毕,重复拼接k次重新入栈 ---> 当前k[encoded_string]转码完毕4.继续读取字符串,重复上述流程直到转换完毕为止*/public String decodeString(String s) {//利用栈进行解码Deque<String> stack = new ArrayDeque<>();//开始解码for(char c : s.toCharArray()) {//不为']',将字符入栈if(c != ']') {stack.push(String.valueOf(c));} //遇到']',当前层级的encoded_string读取完毕,开始转换else {//临时保存拼接后的元素StringBuilder tempStr = new StringBuilder();//将元素弹出栈并拼接,直到遇到'['while(!stack.peek().equals("[")) { //代表当前层级的encoded_string转化完毕//弹出元素并进行拼接(新元素拼接到首位)tempStr.insert(0,stack.pop());}stack.pop(); //弹出'['//继续弹出元素,直到不为数字 ---> 读取KStringBuilder repeatCount = new StringBuilder();while(!stack.isEmpty() && Character.isDigit(stack.peek().charAt(0))) { //采用peek,避免弹出不该弹出的元素repeatCount.insert(0,stack.pop());}//得出K,开始重复拼接K次int k =  Integer.parseInt(repeatCount.toString());StringBuilder repeated = new StringBuilder();for(int i = 0; i < k; i++) {repeated.insert(0,tempStr);}//拼接完毕,重新入栈stack.push(repeated.toString());}}//解码完毕,拼接最后结果StringBuilder result = new StringBuilder();while (!stack.isEmpty()) {result.insert(0, stack.pop()); //注意顺序}return result.toString();}
}

http://www.dtcms.com/a/299823.html

相关文章:

  • 论文阅读-RaftStereo
  • 2025中国GEO优化白皮书:AI搜索优化趋势+行业数据报告
  • 应急控制HMI的“黄金10秒”设计:紧急场景下的操作路径极速简化技术
  • 嵌入式硬件篇---有线串口通信问题解决
  • PHP语法高级篇(六):面向对象编程
  • MyBatis-Plus 核心注解详解:从表映射到逻辑删除的全方位指南
  • C++/CLI vs 标准 C++ vs C# 语法对照手册
  • 9.3 快速傅里叶变换
  • 深度解析 noisereduce:开源音频降噪库实践
  • 深入理解Redission释放锁过程
  • Blender入门笔记(一)
  • 利用RAII与析构函数避免C++资源泄漏
  • 基于DataX的数据同步实战
  • 中电建路桥集团有限公司重大项目管理办公室成立
  • 【安全漏洞】网络守门员:深入理解与应用iptables,守护Linux服务器安全
  • Linux 如何统计系统上各个用户登录(或者登出)记录出现的次数?
  • Ubuntu安装node-red
  • 磁悬浮轴承转子不平衡质量控制策略设计:原理、分析与智能实现
  • C/C++中常量放置在比较操作符左侧
  • 基于匿名管道的多进程任务池实现与FD泄漏解决方案
  • 消息缓存系统
  • Docker学习日志-Docker容器配置、Nginx 配置与文件映射
  • Vim 进阶教程
  • React入门学习——指北指南(第四节)
  • Spring核心:Bean生命周期、外部化配置与组件扫描深度解析
  • 龙迅#LT8711UXD适用于Type-C/DP1.4 /EDP转 HDMI2.0 功能,分辨率高达4K60HZ,可支持HDCP!
  • 01 01 02 第一部分 C++编程知识 C++入门 第一个C++程序
  • 其他世界的自来水
  • 【图像理解进阶】如何在自己的数据集上释放segment anything模型方案的潜力?
  • 20250726-3-Kubernetes 网络-Service三种常用类型_笔记