leetcode 394. Decode String

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Sea_muxixi/article/details/79962486

leetcode 394. Decode String

题意:解码字符串,看输入输出就能懂了。

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) {
		string ans = "";
		int num = 0;
		stack<int> s_num;
		stack<string> s_str;
		for (int i = 0; i<s.size(); i++)
		{
			if (s[i] >= '0' && s[i] <= '9')
				num = num * 10 + s[i] - '0';
			else if (s[i] == '[')
			{
				s_num.push(num);
				s_str.push(ans);
				num = 0;
				ans.clear();
			}
			else if (s[i] == ']')
			{
				int k = s_num.top();
				s_num.pop();
				string temp = s_str.top();
				for (int j = 0; j<k; j++)
					s_str.top() += ans;
				ans = s_str.top();
				s_str.pop();
			}
			else
				ans += s[i];
		}
		return s_str.empty() ? ans : s_str.top();
	}
	
};

对这种嵌套的东西,栈还是很好用啊!

还有一个方法是递归,这个东西想到很难,理解很容易啊!

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 (i < n && 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;
    }
};

阅读更多

没有更多推荐了,返回首页