压缩算法
小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为m|S,例如字符串ABCABCABC将会被压缩为[3|ABC],现在小Q的同学收到了小Q发送过来的字符串,你能帮助他进行解压缩么?
输入例子1:
“HG[3|B[2|CA]]F”
输出例子1:
“HGBCACABCACABCACAF”
例子说明1:
HG[3|B[2|CA]]F−>HG[3|BCACA]F−>HGBCACABCACABCACAF
思路:使用一个栈将字符保存,当检测到’]'字符时,将其之前的字符从栈中取出。当遇到‘['字符时停止取出。
对该字符串进行解析,‘|’之前为m,后为S,要出现m次S,将m次S再放入栈中,最后将栈中的全部内容输出,并且翻转。
可优化的地方:设立一个变量记录遍历过的字符串中‘['的数量,数量为0时可以直接将字符输出,不为0时再使用栈进行存储。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
string str;
cin>>str;
string path;
string ans;
stack<char> stk;
int l_num=0;
for(int i=0;i<str.size();i++){
if(str[i]!=']'){
stk.push(str[i]);
}
if(str[i]=='['){
l_num++;
}
if(str[i]==']'){
path.clear();
while(stk.top()!='['){
path.push_back(stk.top());
stk.pop();
}
stk.pop();//弹出'['
reverse(path.begin(),path.end());
string m;
int pos;
for(int a=0;a<path.size();a++){
if(path[a]!='|'){
m.push_back(path[a]);
}
else {
pos=a;
break;
}
}
int num=stoi(m);
string S=path.substr(pos+1);
for(int b=0;b<num;b++){
for(int c=0;c<S.size();c++){
stk.push(S[c]);
}
}
l_num--;
}
}
while(!stk.empty()){
ans.push_back(stk.top());
stk.pop();
}
reverse(ans.begin(),ans.end());
cout<<ans;
}