スナップ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を返す.実際の面接でこの問題に遭遇したことがありますか?
主にスタックを弾くときに一時変数で保存し、resを更新します.
符号化規則は、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);
}