질문 줄기:
상대적으로 간단하며 문자열과 유사합니다. ABC[3LM][2[2HJ]]
즉 ABCLMLMLMHJHJHJHJ
, 원래 문자열을 제공하고 압축 해제된 문자열을 가져옵니다.
아이디어:
이 질문은 비교적 간단한 재귀이며, 달성하기 위해 스택을 사용합니다. 문자를 읽을 때마다 스택에 쌓이고, 마주치면 ]
숫자를 읽을 때까지 문자를 점차적으로 스택에서 읽어 임시 문자열을 형성합니다.숫자가 추출된 후 배수에 따라 숫자의 임시 문자열을 확장한 다음 스택에 넣습니다.
코드는 다음과 같습니다.
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
char word, temp[20005];
cin>>s;
stack<char> res;
int size = s.size(), j, num, order;
for (int i = 0; i < size; ++i)
{
word = s[i];
if (word != ']')
res.push(word);
else // 如果获取到了 ]
{
j = -1;
// 从stack中把字符拿出来,放到temp中
word = res.top();;
res.pop();
while (word < '0' || word > '9') // 如果没拿到数字
{
temp[++j] = word;
word = res.top();
res.pop();
}
// 如果拿到了数字 开始提取数字
num = word - '0';
order = 10;
word = res.top();
res.pop();
while (word != '[')
{
num += (order * (word - '0'));
order *= 10;
word = res.top();
res.pop();
}
// 如果遇到了闭合符号 [
// num是重复次数 temp最后一个字母的index是j
for (int p = 0; p < num; ++p)
{
for (int y = j; y >=0; --y)
res.push(temp[y]);
}
}
}
j = -1;
while (!res.empty())
{
word = res.top();
res.pop();
temp[++j] = word;
}
for (int i = j; i >= 0; --i)
printf("%c", temp[i]);
return 0;
}
그러나 여기서는 이 상황을 다루지 않았습니다: AS[2[VB3[HJ]]]
, 압축 해제 후가 됩니다 ASVBHJHJHJVBHJHJHJ
. 내 코드는 기본적으로 스택에서 숫자를 가져온 다음 가져옵니다 [
. 즉, 이 예제에서는 이 상황을 고려하지 않습니다 VB
. 그러나 같은 것이 지나갈 수 있습니다. . .
.
재귀 방법:
다른 사람의 솔루션 직접 보기 :
#include<bits/stdc++.h>
using namespace std;
string read()
{
int n;
string s="",s1;
char c;
while (cin>>c)//一直读入字符,直到Ctrl+z
{
if (c=='[')
{
cin>>n;//读入D
s1=read();//读入X
while (n--) s+=s1;//重复D次X
//注:上面不能写成while (n--) s+=read();
}
else
{
if (c==']') return s;//返回X
else s+=c;//如果不是'['和']',那就是X的一个字符,所以加进X
}
}
}
int main()//巨短主函数
{
cout<<read();
return 0;
}
함수가 재귀적으로 호출되는 것을 볼 수 있습니다 read()
.
작은 문제
재귀 코드에서 문자열의 경우 숫자 325를 325SFFS
직접 읽을 수 있고 문자에서 계속 읽을 수 있는 것 같습니다.int n; cin>>n;
S
테스트:
#include<bits/stdc++.h>
#include <sstream>
using namespace std;
int main()
{
string s("aa45sfjsljfls");
std::stringstream stream;
stream<<s;
char c;
stream>>c;
cout<<c<<endl;
stream>>c;
cout<<c<<endl;
int n;
stream>>n;
cout<<n<<endl;
stream>>c;
cout<<c<<endl;
return 0;
}
결과:
a
a
45
s