LeetCode394——字符串解码

题目:

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

示例:

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

思路:

这里要明白入栈的元素到底是什么,由于这里是一个从左到右,从里到外的过程。我们对2[bc]进行操作的时候,需要知道bc之前的字符串的拼接结果和对bc的操作次数(即2)。那么我们就要存储这两个信息,可以用pair的结构。接下来就是分情况进行讨论。当字符为数字的时候,用times记录数字的大小;当字符为'['时,意味着新的解码即将要开始,所以要把旧的数据res以及新的解码进行的次数以pair的形式存入栈中,同时将res置为空,times置为0,方便进行后面的解码操作。当字符为英文字母的时候,用res存放这一连串的字符。当字符为‘]’的时候,就可以计算当前的字符串的结果了,需要取出之前栈的首元素信息,然后进行拼接。

https://leetcode-cn.com/problems/decode-string/solution/zhi-xing-yong-shi-0-ms-zai-suo-you-c-ti-jiao-zh-47/

代码:

class Solution {
private:
	string repeatStr(string T, int times)
	{
		string ans = "";
		for (int i = 0; i < times; i++)
		{
			ans += T;
		}
		return ans;
	}

public:
	string decodeString(string& s) {
		//int len = s.size();
		int times = 0;
		string res = "";
		typedef pair pa;
		vector>st;
		for (auto c : s)
		{
			if (c >= '0' && c <= '9') times = times * 10 + (c - '0');
			else if (c == '[')
			{
				st.push_back(pa(times, res));
				res = "";
				times = 0;
			}
			else if(c==']')
			{
				pa temp = st[st.size()-1];
				st.pop_back();
				res = temp.second + ((temp.first==0)? "" : repeatStr(res,temp.first));
				
			}
			else
			{
				res += c;
			}
		}
		return res;

	}
};

 

你可能感兴趣的:(LeetCode)