大家好,今天给大家带来一道题目:字符串解码。忘记题意的小伙伴查看下图:
下面我们以3[a]2[bc]为例:
不知道小伙伴们以前有没有做过括号匹配问题,如果做过那么很容易的就可以想起这道题应该使用栈来解决。
当我们遇到数字、英文字母、左括号时可以直接入栈,遇见右括号时,我们需要找出与之匹配的左括号,找出二者之间的字符串,如a、bc。然后计算出其需要重复的次数即可得到中间字符串,如aaa、bcbc。计算次数时要注意次数不一定为个位数,也可能是12、120这种。当我们计算出中间字符串时,将其入栈,最终栈的入栈顺序为:aaabcbc,出栈顺序为cbcbaaa,将其进行反转即为最终答案。
再来举一个例子更好理解:3[a2[c]],第一次得到的中间字符串为cc,将其入栈,此时栈的入栈顺序为3[acc,再次遇见右括号,得到中间字符串accaccacc,将其入栈,此时栈的入栈顺序为accaccacc,出栈顺序为ccaccacca,反转即可。(计算中间字符串时需要出栈,并不会造成影响)
给出最终代码:
#include<iostream>
#include<cmath>
#include<stack>
#include<algorithm>
using namespace std;
int main(){
string str="3[a2[c]]",str1="";
stack<char>s,s2,s1;
int i=0,j=0,sum=0;
while(i<str.length()){
if(str[i]!=']'){
s.push(str[i++]);
}
else{
while(s.top()!='['){
str1.push_back(s.top());
s.pop();
}
reverse(str1.begin(),str1.end());
s.pop();//左括号出栈
while(s.top()>='0'&&s.top()<='9'){
s2.push(s.top());
s.pop();
j++;
if(s.empty()){
break;
}
}
for(int k=0;k<j;k++){
sum=sum+(s2.top()-'0')*pow(10,j-k-1);
s2.pop();
}
string ss=str1;
for(int k=0;k<sum-1;k++){
str1=str1+ss;
}
//cout<<str1<<endl;
for(int k=0;k<str1.length();k++){
s.push(str1[k]);
}
i++;
j=0;
sum=0;
str1.clear();
}
}
while(!s.empty()){
s1.push(s.top());
s.pop();
}
while(!s1.empty()){
cout<<s1.top();
s1.pop();
}
}
最终细节大家需要多多注意,比如次数的计算注意减去字符0 ,计算次数时注意数字字符是否为栈顶,将栈顶出完后注意栈空的判断。
希望大家多多点赞评论支持!