从括号匹配到字符串解码:递归思想的巧妙应用

解题思路

这是一个典型的递归问题。关键在于处理嵌套的括号结构:

  1. 遇到字母:直接加入结果
  2. 遇到数字:累积重复次数
  3. 遇到 [:递归处理括号内的子串
  4. 遇到 ]:当前层递归结束,返回结果

使用全局变量 where 记录当前处理位置,让上层递归知道从哪继续处理。

完整代码实现

java 复制代码
public class Solution {
    // 全局变量,记录当前处理到的位置
    public static int where;
   
    public static String decodeString(String str) {
        where = 0;
        return f(str.toCharArray(), 0);
    }
    
    public static String f(char[] s, int i) {
        StringBuilder path = new StringBuilder();
        int cnt = 0;  // 记录重复次数
        
        // 遍历字符串,直到遇到 ']' 或结束
        while (i < s.length && s[i] != ']') {
            if ((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z')) {
                // 情况1:遇到字母,直接追加
                path.append(s[i++]);
                
            } else if (s[i] >= '0' && s[i] <= '9') {
                // 情况2:遇到数字,累积计算重复次数(可能是多位数)
                cnt = cnt * 10 + s[i++] - '0';
                
            } else {
                // 情况3:遇到 '[',需要递归处理括号内的内容
                // 递归调用 f,从 i+1 位置开始(跳过当前的'[')
                String subResult = f(s, i + 1);
                
                // 将递归结果重复 cnt 次,追加到当前结果
                path.append(get(cnt, subResult));
                
                // 更新 i 到递归结束的位置(跳过对应的']')
                i = where + 1;
                
                // 重置重复次数
                cnt = 0;
            }
        }
        
        // 更新全局位置变量,记录当前处理到哪里
        // 如果遇到']',where指向']';否则指向字符串末尾
        where = i;
        
        return path.toString();
    }
    
    public static String get(int cnt, String str) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < cnt; i++) {
            builder.append(str);
        }
        return builder.toString();
    }
  
}

如果觉得有帮助,欢迎点赞、关注、转发~

相关推荐
心平气和量大福大20 分钟前
android-实例-蒲公英-更新与安装-5-签名与生成APK
android·java·开发语言
码哥DFS34 分钟前
构造函数、实例对象、对象原型 ----三者关系
开发语言·javascript·原型模式
952361 小时前
Spring-cloud配置中心
java·spring·spring cloud·微服务
quantdash_cc1 小时前
告别自建 Requests/BS4 网页爬虫:基于 QuantDash 搭建零维保的高性能量化行情流水线
开发语言·爬虫·python·pandas·量化·quantdash
ydd1001001 小时前
寻找两个正序数组的中位数 Java 题解,二分分割详解
java·开发语言
半亩码田2 小时前
C#转Python第3.1篇:Python 的 class 没有访问修饰符?面向对象的另一条路
开发语言·python·c#
阿pin2 小时前
Android随笔-Serializable与Parcelable
android·serializable·parcelable
天空之城--2 小时前
Android 事件分发机制深度解析——原理、源码与实战综合总结
android
真上帝的左手2 小时前
10. 软件设计&架构-Spring Security 7 整合CAS SSO 单点登录
java·spring·架构·sso
Wzx1980122 小时前
python沙箱和docker沙箱你选对了吗?
开发语言·python·docker