递归算法练习-解压缩

递归算法练习-解压缩

题目

现在有一种字符串的压缩规则是这样的: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;
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值