题目
现在有一种字符串的压缩规则是这样的:k[string],表示string连续出现k次(0 < k < 1000)。
例如:s = “ef3[a]2[bc]gh” 解压后的字符串为 “efaaabcbcgh”。这种压缩也可以嵌套,s = “3[a2[c]]” 解压后为 “accaccacc”。
输入一个字符串s,请输出一个解压后的字符串。输入都是严格合法的,数字只用来表示重复次数,不会出现3a或者2[4]这样的输入。解压后的字符串只有字母。
思路
应用递归的思想,并列括号顺序处理,嵌套括号递归处理。
处理方式:遇到括号,将括号内解压后的字符串叠加n次,插入到原字符串指定位置,注意边界。
终止条件:当字符串中没有数字时终止,返回原串。
实现
public String recursion(String parStr) {
// 从做到右遍历
int iter = 0;
while (iter < parStr.length()) {
// 发现数字,进行处理
if (parStr.charAt(iter) >= '1' && parStr.charAt(iter) <= '9') {
// 将char型数字转化为int型数字
int cirNum = Integer.parseInt(""+parStr.charAt(iter));
// left表示左括号下标,right表示右括号下标
int left = iter + 1;
// 寻找left匹配的right
int right = iter+2;
int coupleNum = 1;
while (right < parStr.length()) {
if (parStr.charAt(right) == '[') {
coupleNum++;
}
if (parStr.charAt(right) == ']') {
coupleNum--;
}
if (coupleNum == 0) {
break;
}
right++;
}
// 截取left和right中间的子串
String subString = parStr.substring(left + 1, right);
// 递归处理子串
String tempString = recursion(subString);
// 将处理后的子串累加cirNum次
StringBuilder recursionStr = new StringBuilder();
for (int i = 0; i < cirNum; i++) {
recursionStr.append(tempString);
}
// 将累加后的子串拼接到父串上
parStr = parStr.substring(0, iter) + recursionStr.toString() + parStr.substring(right+1);
//拼接后iter跳到正确的位置
iter = iter + cirNum * (right - left - 1);
}
// 不是数字,继续寻找
else {
iter++;
}
}
// 返回原串或者处理后的串
return parStr;
}