2026年--Lc330-394. 字符串解码(栈)--java版

1.题目


2.思路

补充1:

用双栈,一个是数字栈,一个是符号栈。用来分别存储数字和符号。创建数字的临时变量、字符串的临时变量,用来保存现场。

遍历传入的参数,如果遇到的字符是数字,且数字是多位用num乘法10+尾数-'0';如果是左括号,把之前遇到的数字加入到数字栈,字符加入到字符栈,同时充值数字临时变量和字符临时变量,重新寻找。如果遇到右括号,将栈顶的数字弹出来,查看要循环几次。同时把字符栈的栈顶元素弹出来。将当前的字符串进行追加拼接,返回合并的结果。如果遇到的是普通字符,用字符临时变量和当前字符进行拼接。

补充2:

curStr 始终表示:"当前这一层(当前所处括号层级)正在构建的字符串结果"。

在最外层(还没进任何括号)时:curStr 是最外层已经拼好的字符串。

进入一层 [ 后:我们把外层的 curStr 入栈保存,然后把 curStr="",开始在新层里拼括号内部的内容。

在括号内部遇到字母:curStr += 字母,它就慢慢变成括号内部的字符串。

遇到 ]:说明括号内部拼完了,此时 curStr 就是 这一层括号内的结果,要拿它去重复 times 次,并接回上一层前缀。

所以:curStr 是"当前层"的工作区,会随着层级变化而变化。

strSt.pop() 给你的是上一层括号外的前缀

curStr 是这一层括号内已经解码好的字符串

sb.append(curStr) 是把括号内的内容重复拼接回前缀里

栈里存的是"外层的 curStr(前缀)",不是当前括号内部的内容

例子:

3.代码实现

java 复制代码
class Solution {
    public String decodeString(String s) {
        Stack<Integer> numSt=new Stack<>();
        Stack<String> strSt=new Stack<>();
        //数字的临时变量
        int num=0;
        //字符串的临时变量
        String curStr="";
        for(int i=0;i<s.length();i++)
        {
            //获取当前字符
            char curCharacter=s.charAt(i);
            //如果是遇到的字符是数字
            if(Character.isDigit(curCharacter))
            {
              num=num*10+curCharacter-'0';
            }else if(curCharacter=='[')
            {
                //4.如果是左括号,把当前的数字和字符入栈,同时重置当前数字和当前字符串
                numSt.push(num);
                strSt.push(curStr);
                num=0;
                curStr="";
            }else if(curCharacter==']')
            {
                 //5.如果是右括号,就进行解码。得到当前字符串就是要重复的次数,也就是[]前的数字
                 int times=numSt.pop();
                  //6.创建栈顶元素的String容器
                  StringBuilder sb=new StringBuilder(strSt.pop());
                  for(int k=0;k<times;k++)
                  {
                    sb.append(curStr);
                  }
                  // 关键:合并结果回到 curStr
                  curStr =sb.toString();
            }else{
                //7.如果是字母就更新字母栈为当前字母,也就是直接加入到当前字符串中
//                 把当前读到的普通字母追加到当前正在构建的字符串 curStr 后面。

// 比如当前 curStr="ab",读到 curCharacter='c':

// 变成 "ab" + 'c' → "abc"
                 curStr=curStr+curCharacter;
            }


        }
        return curStr;

        
    }
}
相关推荐
骇客野人17 小时前
通过脚本推送Docker镜像
java·docker·容器
刘琦沛在进步17 小时前
【C / C++】引用和函数重载的介绍
c语言·开发语言·c++
机器视觉的发动机17 小时前
AI算力中心的能耗挑战与未来破局之路
开发语言·人工智能·自动化·视觉检测·机器视觉
铁蛋AI编程实战17 小时前
通义千问 3.5 Turbo GGUF 量化版本地部署教程:4G 显存即可运行,数据永不泄露
java·人工智能·python
HyperAI超神经17 小时前
在线教程|DeepSeek-OCR 2公式/表格解析同步改善,以低视觉token成本实现近4%的性能跃迁
开发语言·人工智能·深度学习·神经网络·机器学习·ocr·创业创新
晚霞的不甘17 小时前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频
SunnyDays101117 小时前
使用 Java 冻结 Excel 行和列:完整指南
java·冻结excel行和列
R_.L17 小时前
【QT】常用控件(按钮类控件、显示类控件、输入类控件、多元素控件、容器类控件、布局管理器)
开发语言·qt
Zach_yuan17 小时前
自定义协议:实现网络计算器
linux·服务器·开发语言·网络
摇滚侠17 小时前
在 SpringBoot 项目中,开发工具使用 IDEA,.idea 目录下的文件需要提交吗
java·spring boot·intellij-idea