思想:借助栈
和上一题类似,知道了用栈之后就要去分情况考虑了
首先考虑需要的变量:stack s1; int num;string res;
(1)当前遍历的是左括号时:将num当前res内容进栈 (在这里可以利用双栈)同时清空res和num
(2) 当前遍历的是右括号时:弹出栈顶状态并进行组合,
在这里组合值得是num倍的res里面的字符串 然后放在栈顶状态中的字符后面 此时要记得删除栈顶元素。
(3)当前遍历的是数字时:将其变为整型存在num中
(4)当前遍历的是字母时: 置res=此字母,并将num=0
//题解:借助栈
//和上一题类似,知道了用栈之后就要去分情况考虑了
//首先考虑需要的变量:stack<string> s1; int num;string res;
//(1)当前遍历的是左括号时:将num当前res内容进栈 (在这里可以利用双栈)同时清空res和num
//(2) 当前遍历的是右括号时:弹出栈顶状态并进行组合,
// 在这里组合值得是num倍的res里面的字符串 然后放在栈顶状态中的字符后面 此时要记得删除栈顶元素。
//(3)当前遍历的是数字时:将其变为整型存在num中
//(4)当前遍历的是字母时: 置res=此字母,并将num=0
#include<iostream>
#include<stack>
#include<string>
using namespace std;
class Solution{
public:
string decodeString(string s){
stack<int> numstack;
stack<string> strstack;
int num;
string res="";
for(int i=0;i<s.length();i++){
if((s[i]>='A' &&s[i]<='Z') || (s[i]>='a' && s[i]<='z')){
res=res+s[i];
}
else if(s[i]=='['){
numstack.push(num);
strstack.push(res);
num=0;
res="";
}
else if(s[i]==']'){
int k=numstack.top();
numstack.pop();
for(int j=0;j<k;j++){
strstack.top()+=res;
}
res=strstack.top();
strstack.pop();
}
else{
num = 10*num+s[i]-'0';//不能硬变 s[i]-'0'是相对位置,得到的数值就是0-9
//比如如果s[i]=9 那么变为数值就是'9'-'0'=9 但是如果这个时候 s[i]的前面是1,也就是说现在这个真正的num=19
//那么遍历到1的时候执行这个代码num=1,遍历到9的时候,num=10+9=19.
}
}
return res;
}
};
int main(){
string s;
cin>>s;
string res=Solution().decodeString(s);
cout<<res<<endl;
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容