394. 字符串解码

题目:

思路:

【1】递归分解模拟的方式

思考如何分解:
如 3[a]2[bc]3[a2[c]]2[abc]3[cd]efabc3[cd]xyz
其中每个[]都是可以拆分的如
3[a] + 2[bc] + 3[a2[c]] + 2[abc] + 3[cd] + efabc + 3[cd] +xyz
那么 a 就会被传递到下一层,那么a就是新的入参
返回 a ,再根据数字 3 * a = aaa
其中比较复杂的就是3[a2[c]],
a2[c]作为第二层的入参
而c作为第三层的入参

所以这到题考虑出如何去除相对应匹配的[]里面的内容的时候就会变得很简单了

代码展示:

【1】递归分解模拟的方式

//时间0 ms 击败 100%
//内存39.6 MB 击败 60.14%
class Solution {
    public String decodeString(String s) {
        StringBuffer buf , res = new StringBuffer();
        int i = 0 , countL = 0;
        char[] ch = s.toCharArray();
        while (i < ch.length){
            if (ch[i] >= 'a' && ch[i] <='z'){
                res.append(ch[i]);
            }else {
                //如果不是字符那么必然是数字出身
                int sum = 0;
                while (ch[i] >= '0' && ch[i] <= '9'){
                    sum = sum*10 + (ch[i] - '0');
                    i++;
                }
                // 取完数字后便要取出数字后面的括号内的字符串去递归
                if (ch[i++] == '['){
                    countL = 1;
                    buf = new StringBuffer();
                    while (countL > 0){
                        if (ch[i]== ']') countL--;
                        if (countL == 0) break;
                        buf.append(ch[i]);
                        if (ch[i]== '[') countL++;
                        i++;
                    }
                    // 递归解析[]内的东西,并且循环加入到结果集
                    String temp = decodeString(buf.toString());
                    while (sum-- > 0){
                        res.append(temp);
                    }
                }
            }
            i++;
        }
        return res.toString();
    }
}
posted @ 2023-08-03 16:27  忧愁的chafry  阅读(11)  评论(0编辑  收藏  举报