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

71.字符串解码

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

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

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

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

测试用例保证输出的长度不会超过 105

示例 1:

输入:s = "3[a]2[bc]"
输出:"aaabcbc"

【参数】

  1. 数字栈Deque<Integer> numStack:保存括号前的重复次数k(处理多位数,如10[ab]);
  2. 字符串栈Deque<String> strStack:保存括号前已经拼接好的字符串(如2[3[a]b]中,进入3[a]前的"",进入b前的aaa);  暂存每一层 [前的已拼接完成字符串](历史状态),只有遇到]时才会弹出使用
  3. 两个临时变量:
    • curStr:保存当前正在拼接的普通字符串(未遇到括号 / 数字的部分);实时拼接当前正在处理的字符串(括号内 / 外的普通字符),是最终拼接容器
    • curNum:保存当前正在解析的数字(处理多位数,如123[a]需要逐位拼 1→12→123)。

核心执行流程(按字符类型分情况处理)

遍历字符串的每个字符c,分 4 种情况:
  1. 数字:拼curNumcurNum = curNum * 10 + (c - '0')),处理多位数;
  2. 左括号[:将「当前状态」入栈(数字栈压curNum,字符串栈压curStr(实际是preStr因为是括号前的前的字符串压栈)),然后重置curNum=0curStr="",准备解析括号内的内容;
  3. 右括号]:出栈恢复状态(弹出数字栈的k,弹出字符串栈的preStr([ab])),将curStr重复k次后拼接到preStr,赋值给curStr(作为新的当前字符串);
  4. 字母:直接拼到curStr上。
遍历结束后,curStr就是最终解码后的字符串。

【总结易混点】

strStack 存 preSte; curStr存 [括号内的] 

【语法注意】

  • 字符串转数字 ‘123’-‘0’ = 123
  • Character.isDigit(ch)  判断ch是否为数字 ,是返回true
  • curStr.setLength(0);   // 清空当前StringBuilder内的字符串
  • StringBuilder 插入 append(任意类型
  • delete(int start, int end)  删除 [start, end) 区间的字符
  • deleteCharAt(int index)删除指定索引的单个字符
  • insert(int offset, 任意类型)在指定索引插入内容
  • replace(int start, int end, String str)替换 [start, end) 区间为指定字符串
  • reverse()反转字符串sb.reverse()
  • length()获取当前字符串长度
  • capacity() 获取当前底层数组的容量int cap = sb.capacity()
 
class Solution {public String decodeString(String s) {// 数字栈:保存括号前的重复次数kDeque<Integer> numStack = new LinkedList<>();// 字符串栈:保存括号前已拼接好的字符串Deque<String> strStack = new LinkedList<>();// 当前正在拼接的普通字符串StringBuilder curStr = new StringBuilder();// 当前正在解析的数字(处理多位数,初始0)int curNum = 0;// 遍历每个字符for (char c : s.toCharArray()) {if (Character.isDigit(c)) {// 情况1:数字,处理多位数(如123[a] → 1→12→123)curNum = curNum * 10 + (c - '0');} else if (c == '[') {// 情况2:左括号,入栈保存当前状态,然后重置
                numStack.push(curNum);  // 数字入栈
                strStack.push(curStr.toString());  // 当前拼接好的字符串入栈!!!
                curNum = 0;
                curStr.setLength(0); // 清空当前StringBuilder内的字符串    
            } else if (c == ']') {// 情况3:右括号,出栈拼接重复字符串int k = numStack.pop(); // 弹出重复次数String preStr = strStack.pop(); // 弹出括号前的字符串// 临时字符串,保存curStr重复k次的结果StringBuilder tmp = new StringBuilder(preStr);for (int i = 0; i < k; i++) {tmp.append(curStr);}// 重置curStr为拼接后的结果,继续后续处理curStr = tmp;} else {// 情况4:字母,直接拼接
                curStr.append(c);}}// 最终curStr就是解码结果return curStr.toString();}
}

【轻敌了,绕得很】

【背】

http://www.jsqmd.com/news/350132/

相关文章:

  • 2026年全国垃圾焚烧炉厂家权威榜单 全场景覆盖 智能化节能化实力呈现 - 深度智识库
  • 两个节点部署Kubernetes集群完整指南(个人测试环境)
  • 盘点无锡可靠的不锈钢抛光厂,金属内腔抛光厂推荐有哪些 - 工业设备
  • 一文速通 OceanBase 物化视图能力
  • 分析青岛有名的龙膜授权企业,靠谱的推荐有哪些 - 工业品牌热点
  • 30.Android系统源码-libYUV实战 - YUV格式转换与SIMD优化核心技术
  • 变形监测必看!2026年单北斗GNSS变形监测系统排行榜,助力精准监测与安全管理
  • 导师又让重写?10个AI论文网站测评:本科生毕业论文写作神器推荐
  • 导师又让重写?8个AI论文网站深度测评,自考毕业论文写作必备!
  • 损耗直降 40%+:RFID 资产管理系统,企业降本增效的新解法
  • 靠谱的广告策划公司有哪些,推荐广告策划品牌企业 - 工业推荐榜
  • Java方法回顾及加深
  • 流延机费用怎么算,流延机制造厂哪家更值得选? - 工业品网
  • python接口自动化-全局常量如何在yaml文件中作为入参使用
  • 别再瞎找了!8个降AIGC平台测评:专科生降AI率必备神器
  • 2026更新版!10个AI论文工具测评:本科生毕业论文写作与科研写作必备指南
  • 多波束前视声呐采购攻略:高稳定性品牌与现货供应商优选 - 品牌推荐大师1
  • 2026年食品级软管厂家权威推荐:食品级PU/钢丝/透明软管源头厂家精选 - 品牌推荐官
  • afa
  • PC-自定义windows文件图标与默认打开方式
  • 【开源项目分享】跨平台+批量终端管理!自研视频编解码算法的国产远程桌面控制神器:JWRC发布1.8.2版本,用2ms延迟重新定义效率
  • 实用指南:基于java的SpringBoot/SSM+Vue+uniapp的出行服务系统的详细设计和实现(源码+lw+部署文档+讲解等)
  • 2026年氨水厂家权威推荐:电子级/食品级/化工用/脱硫氨水源头厂家精选 - 品牌推荐官
  • 2026天津短视频运营公司权威推荐,智能营销中台与精准获客实力解读 - 品牌鉴赏师
  • 【科技补全76】新概念英语点读工具NCE-Flow、在线材料管理器copyparty 部署指北
  • 2026航空插头厂家推荐,连接器兼容性与抗干扰能力深度测评 - 品牌鉴赏师
  • 2026年2月长沙数字营销/GEO优化/AI搜索/公司综合实力五强榜单 - 2026年企业推荐榜
  • 2026春季男士通勤裤休闲裤行业深度观察,哪个值得买?解决通勤商务出差多场景痛点 - 行业深度观察
  • 2026年广告策划公司价格大比拼,广告策划公司推荐 - 工业推荐榜
  • 读《那朵花》有感