算法设计与分析第十二次作业

394. Decode String

题目描述如下:

Given an encoded string, return it’s decoded string.
The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is guaranteed to be a positive integer.
You may assume that the input string is always valid; No extra white spaces, square brackets are well-formed, etc.
Furthermore, you may assume that the original data does not contain any digits and that digits are only for those repeat numbers, k. For example, there won’t be input like 3a or 2[4].
Examples:
s = “3[a]2[bc]”, return “aaabcbc”.
s = “3[a2[c]]”, return “accaccacc”.
s = “2[abc]3[cd]ef”, return “abcabccdcdcdef”.

这道题要求解析一个字符串,数字后面的括号内的内容要重复这个数字那么多次,可以有多层的括号包含

这道题我们很显然的可以把其化为一个个的子问题,因为整个字符串的数字后面一定会有一个括号包含着的字符串,而这部分字符串里面可能也有数字,所以就可以采用递归的思想,把这部分字符串也同样采用这个方法来解析,然后这样我们就让字符串的长度缩小了,而算法并不需要做改变。

不过需要注意的是在遍历字符串的过程中,遇到一个数字后,因为其里面可能还有子括号,所以可以采用栈的思想,必须当括号完全匹配完成的时候才说明这部分字符串是要重复的部分,但是由于这里只有一种括号,所以直接统计栈的大小就可以了,不用真的去实现一个栈,代码实现如下:

class Solution {
public:
    string decodeString(string& s) {
        int index = 0;
        int length = s.length();
        while(index < length){
            if(s[index] >= '0' && s[index] <= '9'){
                int repeatTime = 0;
                while(s[index] >= '0' && s[index] <= '9'){
                    repeatTime = repeatTime * 10 + s[index] - '0';
                    index++;
                }
                int match = 1;
                index++;
                string toRepeat;
                while(match){
                    if(s[index] == '[')
                        match++;
                    else if(s[index] == ']')
                        match--;
                    toRepeat.push_back(s[index++]);
                }
                toRepeat.pop_back();
                for(int i = 0; i < repeatTime; i++){
                    decodeString(toRepeat);
                }
            }
            else{
                ans.push_back(s[index]);
                index++;
            }
        }
        return ans;
    }
    string ans;
};

这个算法的复杂度为0(N),N为最终打印出的字符串的长度,这个算法表面上看有点多余的操作,因为给人的感觉就是把其中的一部分提取了出来然后再遍历了一次,实际上我们确实有这样子的操作,但是这样子的操作并不影响算法的效率,因为虽然这部分字符串是被重复扫描了,但是这部分字符串是要被重复输出的,而要输出一个大小为N的字符串(在这里是拼接出)至少是需要N步的,所以总的复杂度并不会受到影响,提交后发现算法效率超过了100%的提交,说明时间复杂度应该没有更好特别多的算法了,而空间复杂度为O(n),n为被解析字符串的长度,也在可以接受的范围内

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值