&LeetCode0394& 字符串解码

北城以北 提交于 2020-03-05 22:18:46

题目

给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a2[4] 的输入。

示例:

s = “3[a]2[bc]”, 返回 “aaabcbc”.
s = “3[a2[c]]”, 返回 “accaccacc”.
s = “2[abc]3[cd]ef”, 返回 “abcabccdcdcdef”.

来源:力扣(LeetCode

思路

首先,把一个括号中的所有内容看成一个整体,一次递归函数返回一对括号中解码后的字符串;
其次,给定的编码字符串实际上只有四种字符,数字,字母和左右括号,所以开始用一个变量i0开始遍历到字符串的末尾,由于左括号都是跟在数字后面,所以先遇到的字符只能是数字或者字母,如果是字母,直接存入结果中,如果是数字,循环读入所有的数字,并正确转换,那么下一位非数字的字符一定是左括号,指针右移跳过左括号,对之后的内容调用递归函数求解;
再次,注意循环的停止条件是遍历到末尾和遇到右括号,由于递归调用的函数返回了子括号里解码后的字符串,而我们之前把次数也已经求出来了,那么循环添加到结果中即可。

C++代码

class Solution {
public:
    string decodeString(string s) 
    {
        int i = 0;
        return decode(s, i);
    }

    string decode(string s, int& i)
    {
        string res = "";
        int n = s.size();

        while (i < n && s[i] != ']')
        {
            if (s[i] < '0' || s[i] > '9')
            {
                res += s[i++];
            }
            else
            {
                int cnt = 0;
                while (s[i] >= '0' && s[i] <= '9')
                {
                    cnt = cnt * 10 + s[i++] - '0';
                }
                ++i;
                string t = decode(s, i);
                ++i;
                while (cnt-- > 0)
                {
                    res += t;
                }
            }
        }
        return res;
    }
};
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!