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

--- 字符串解码 递归解法 通俗易懂 ---

给一个字符串,他按一定规律进行编码,对他进行解码,具体就不解释了,不过有个还需要知道,编码的字符串时有嵌套的情况的 比如 33[aa33[aa]] 这样

算法思想

a3[a]2[bc]

对这个字符串解码 那么会有这俩中情况 cur表示遍历到的数组下标

cur为字母,直接拼接到放回需要放回的字符串上

如果为数字,那么之后的字符就会设计到解码了

而者解码就涉及了三步

1 获取到数字 字符串解码的次数 x

2 获取到字符串

3 将字符串复制 x 次

之后将解码好的字符串拼接到最终结果中

如果不涉及到嵌套的解码话,那么以上这样就已经能够解决了额,但是是有这种情况的

所以解码方法中,也会涉及到相同的解码逻辑,这就可以使用递归了

所以 解码方法的具体逻辑应该时这样

// 获取到解码次数

// 获取到字符串 -> 判断是否有数字

有 递归 解码

没有 正常逻辑

// 复制字符串

// 放回解码好的字符串

大的方向就是这样,但是还涉及到几个细节问题

1. 最重要的 字符串的遍历问题, 因为在递归中,下标时不共享的,那么不知道当前已经递归到哪个下标,

方法一 可以将 返回值改为 单枪递归完的下标,把复制好的额字符串给作为全局变量,这样在方法中 把复制的字符串给评到全局变量中,但是又因为涉及到递归的原因,这个全局变量拼接时,会是反者的 具体来说是这样 2[aa1[bb]] -> bbaabbaa 因为他是从尾巴添加嘛,导致解码字符串顺序乱了,而且这样还会涉及到当前 ] 是谁的的问题,需要对放回的下标 ++ ,这样下标会跳跃起来,变得不可控和复杂,所以这样是不行的 (这是我第一次写的 没过 )

方法二 既然会又字符串的顺序问题,那么就可以让他放回字符串,将放回的字符串又拼接到当前的需要复制的字符串后,就解决了,那下标的问题呢, 那就让下标改为全局的,正好这个下标也是不会回退一个一个的遍历整个字符串,很适合,且这样还可以少了解决 ] 和 下标跳跃的事

能解决

2 字符串的拼接

既然已经确定使用一个全局的下标遍历和放回解码好的字符串,那么其实者就很简单了,因为会将字符串放回,所以只需要一个作用域是方法的字符串就来拼接需要解码方法放回的字符串就行

其实只需要把第一个想出来,那么这题就很明朗了 尤其是放回解码好的字符串,之前想的是放回下标来解决方法之间的下标问题,这样下标会跳着走,特别麻烦和不可控

代码实现

// 全局的遍历下标 int cur = 0; public String decodeString(String s) { StringBuilder ans = new StringBuilder(); for (; cur < s.length(); cur++) { if (s.charAt(cur) >= '0' && s.charAt(cur) <= '9') { ans.append(dfs(s)); } else if (s.charAt(cur) >= 'a' && s.charAt(cur) <= 'z') { ans.append(s.charAt(cur)); } } return ans.toString(); } // dfs 表示处理一次3[ab] 的操作 cur 是第一次遇到了数字 返回的是]的下标 // cur开始这个位置可能 会有嵌套的 那么需要第字符串原地的修改 可以使用insert来对index位置插入字符串 // 这个储存最终要复制的字符串 StringBuilder dfs(String s) { // 当前的解码字符串 StringBuilder curCopy = new StringBuilder(); //获取到数字 int prev = cur; while (s.charAt(cur) >= '0' && s.charAt(cur) <= '9') cur++; String times = s.substring(prev, cur); // System.out.println("循环次数 " + times + " " + " p = " + prev + " c = " + cur); //获取到复制字符串 这里cur应该是[ prev = cur + 1; while (s.charAt(cur) != ']') { // 为数字说明嵌套了 if (s.charAt(cur) >= '0' && s.charAt(cur) <= '9') { curCopy.append(dfs(s)); // System.out.println("嵌套str " + curCopy); } else if (s.charAt(cur) >= 'a' && s.charAt(cur) <= 'z') { curCopy.append(s.charAt(cur)); } cur++; } // System.out.println("找到复制的字符串 " + curCopy + " " + " p = " + prev + " c = " + cur); // 循环添加 String tmp = curCopy.toString(); for (int i = 0; i < Integer.parseInt(times) - 1; i++) { curCopy.append(tmp); } // System.out.println(" 当前的解码字符串 " + curCopy + " " + " p = " + prev + " c = " + cur + " " + times); return curCopy; }
http://www.cnnetsun.cn/news/20971.html

相关文章:

  • PHPBrew自定义任务终极指南:扩展开发与实战技巧
  • 如何优雅重构HP-Socket应用:Deno 2.0兼容性深度解析与迁移策略
  • 老旧Mac升级终极指南:完整教程解锁macOS兼容新世界
  • 联想显卡散热风扇更换教程查找全攻略:从官方指引到社区经验
  • springboot基于vue的管网隐患安全巡检系统_i2g600ga
  • next-scene LoRA实战指南:3步实现电影级分镜AI生成
  • 传统算法之Canny亚像素边缘检测及将离散边缘点链接成线条的优化和探讨。
  • Autoware卡尔曼滤波技术:让自动驾驶感知系统更精准可靠
  • 优化算法matlab实现(一)相关matlab基础
  • 降本增效利器!腾讯云云服务器成本优势全解析
  • 如何5分钟搭建跨平台窗口监控系统:终极工具完全指南
  • NotchDrop:让MacBook刘海变身智能文件中转站
  • 5亿参数改写边缘智能规则:腾讯Hunyuan-0.5B-Instruct轻量化模型深度解析
  • 如何快速解决Nacos数据库升级冲突:5个实用技巧
  • 高密度互连板层压创新:从任意层互连到微孔填充技术
  • 高频PCB层压材料进化:介电性能博弈
  • 3.6万专业观众+50+采购团 CES Asia2026破解创新产品市场对接难题
  • B站漫画下载终极指南:一键搞定海量漫画本地化管理
  • 基于SpringBoot+vue的华强北商城二手手机管理系统
  • 20、音频插件与视频播放的技术实现
  • 贝锐携手中兴!星云MAX内置蒲公英异地组网,路由器变身私有云枢纽
  • 虚拟机性能优化实战指南
  • Blender 必备插件深度推荐:全面提升建模、动画、渲染效率的专业工具集(适用于 Blender 5.0)
  • 面部表情识别终极指南:5分钟快速部署PyTorch深度学习系统
  • 稳定性(二):ANR
  • Spark-TTS实战指南:零基础搭建智能语音合成系统
  • 用n8n打造自愈型用例库与质量知识图谱
  • WMS:仓库的“智能机器人指挥官”——现代仓储革命性的空间与时间管理者
  • 压缩机的精准客户群体都有哪些?
  • Topit窗口置顶神器:彻底告别Mac多任务窗口遮挡烦恼