
解题思路
这是一个典型的递归问题。关键在于处理嵌套的括号结构:
- 遇到字母:直接加入结果
- 遇到数字:累积重复次数
- 遇到
[:递归处理括号内的子串 - 遇到
]:当前层递归结束,返回结果
使用全局变量 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();
}
}
如果觉得有帮助,欢迎点赞、关注、转发~