难度:Medium
题目:
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为:
k[encoded_string]
,表示其中方括号内部的encoded_string
正好重复k
次。注意k
保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数
k
,例如不会出现像3a
或2[4]
的输入。
示例 1:
输入:s = "3[a]2[bc]" 输出:"aaabcbc"
示例 2:
输入:s = "3[a2[c]]" 输出:"accaccacc"
示例 3:
输入:s = "2[abc]3[cd]ef" 输出:"abcabccdcdcdef"
示例 4:
输入:s = "abc3[cd]xyz" 输出:"abccdcdcdxyz"
提示:
1 <= s.length <= 30
s
由小写英文字母、数字和方括号'[]'
组成s
保证是一个 有效 的输入。s
中所有整数的取值范围为[1, 300]
Related Topics
- 栈
- 递归
- 字符串
重点!!!解题思路
第一步:
明确解题手段:从示例二可以看出中括号套中括号,这种就可以看出能使用递归来解决
第二步:
既然我们已经要使用递归来解决,那么递归的是什么?
递归的只能是中括号里的字符串,我们要判断字符串是否遍历结束,那么递归回来我们需要知道递归结束后的下标,并且需要知道递归回来的字符串是什么样子的。
这样问题就解决了。
源码+讲解:
class Solution {
public String decodeString(String s) {
return decodeString(s,0)[0];
}
public String[] decodeString(String s,int i) {
StringBuffer res = new StringBuffer(); //用来拼接字符串
int num=0; //初始化num值,这里指字符串中的数字
while (i<s.length()) {
if (s.charAt(i) >= '0' && s.charAt(i) <= '9') { //数字进来操作
num = num * 10 + (s.charAt(i) - '0');
} else if (s.charAt(i) == '[') { //如果是左括号进入递归,递归回来的数据即是中括号里面结束的东西
String[] temp=decodeString(s,i+1);
i=Integer.parseInt(temp[0]); //获得递归结束回来的i下标
while (num>0){ //根据num判断递归回来的字符串需要重复几遍
res.append(temp[1]);
num--;
}
}else if (s.charAt(i)==']'){ //遍历到]意味着递归结束,返回下标和字符串
return new String[]{String.valueOf(i), res.toString()};
}else{
res.append(s.charAt(i)); //不是数字也不是[]那么这个字符需要拼接
}
i++; //下标移动
}
return new String[]{res.toString()}; //最后返回全部拼接好的字符串
}
}
运行结果:
系列持续更新中,喜欢练习算法的那就点个攒吧