问题描述
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例 1:
输入:s = “3[a]2[bc]”
输出:“aaabcbc”
示例 2:
输入:s = “3[a2[c]]”
输出:“accaccacc”
示例 3:
输入:s = “2[abc]3[cd]ef”
输出:“abcabccdcdcdef”
示例 4:
输入:s = “abc3[cd]xyz”
输出:“abccdcdcdxyz”
#include <iostream>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
/*class Solution {
public:
//刚开始声明的是字符型的栈,太繁琐,之后声明的是字符串的栈
string decodeString(string s) {
stack<char> t;
string str;
string str1;
string k;
for(int i=0;i<s.length();i++){
if(s[i]!=']'){
t.push(s[i]);
continue;
}
else {
k="";str="";
while(!t.empty()&&t.top()!='['){
k+=t.top();
t.pop();
}
t.pop();
reverse(k.begin(),k.end());
int m=0;str1="";
while((!t.empty())&&t.top()>='0'&&t.top()<='9'){
str1+=t.top();
t.pop();
}
reverse(str1.begin(),str1.end());
for(int i=0;i<str1.length();i++){
m=m*10+(str1[i]-'0');
}
for(int j=0;j<m;j++){
str=str+k;
}
for(int n=0;n<str.length();n++){
t.push(str[n]);
}
}
}
str="";
while(t.size()>0){
str=str+t.top();
t.pop();
}
reverse(str.begin(),str.end());
return str;
}
};
*/
//自己改进写的
class Solution {
public:
string decodeString(string s) {
//声明一个数字栈,一个字符串栈
stack<int> nums;
stack<string> strs;
int num;string str;
str="";num=0;
for(int i=0;i<s.length();i++){
// 方括号前的数字可能不是个位数,用以下操作才把这个数字记录
if(s[i]>='0'&&s[i]<='9'){
num=num*10+(s[i]-'0');
}
//把方括号里的字符用str来记录
else if((s[i]>='a'&&s[i]<='z')||s[i]>='A'&&s[i]<='Z'){
str+=s[i];
}
else if(s[i]=='['){
nums.push(num);
num=0;
strs.push(str);
str="";
}
else if(s[i]==']'){
for(int j=0;j<nums.top();j++){
strs.top()+=str;
}
nums.pop();
str=strs.top();
strs.pop();
}
}
return str;
}
};
int main()
{
string s;
cin>>s;
string str=Solution().decodeString(s);
cout<<str;
return 0;
}