スナップ394文字列復号

1817 ワード

符号化された文字列を指定し、復号された文字列を返します.
符号化規則は、k[encoded_string]であり、カッコ内のencoded_を表すstringはちょうどk回繰り返します.注意kは正の整数であることを保証する.
入力文字列は常に有効であると考えられます.入力文字列には余分なスペースがなく、入力した四角カッコは常にフォーマットの要件を満たしています.
また、元のデータには数字は含まれておらず、すべての数字は重複回数kのみを表し、例えば3 aや2[4]のような入力は現れないと考えられます.
例:
s="3[a]2[bc],"aaabcbc"を返す.s="3[a 2[c]",は"accaccacc"を返す.s="2[abc]3[cd]ef"、abcabccdcdefを返す.実際の面接でこの問題に遭遇したことがありますか?
 :
 , nums, strs; num , res .
 ‘[’ , num res
 ‘]’ , res, string temp 。

主にスタックを弾くときに一時変数で保存し、resを更新します.
#include
#include
#include
#include
#include
#include

using namespace std;

class Solution {
private:
	stack nums;
	stack strs;
public:
	string decodeString(string s) {
		int num = 0;// 
		string res = "";
		for (int i = 0; i < s.size(); ++i) {
			if (s[i] >= '0'&&s[i] <= '9') {
				num = 10 * num + s[i] - '0';
			}
			else if (s[i] >= 'a'&&s[i] <= 'z'||s[i]>='A'&&s[i]<='Z') {
				res += s[i];// 
			}
			else if (s[i] == '[') {// '[' 
				nums.push(num);
				strs.push(res);// res 
				num = 0;
				res = "";
			}
			else if(s[i] == ']') {
				int times = nums.top();
				nums.pop();
				string temp_str = strs.top();
				strs.pop();
				for (int j = 0; j < times; ++j)
					temp_str += res; // res strs.top() res, 
				res = temp_str; // res
			}
		}
		return res;
	}
};
int main() {
	Solution* ptr = new Solution();
	string res = ptr->decodeString("3[a]2[bc2[af]]");
	cout << res << endl;
	while (1);
}