展开字符串Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3132 Accepted Submission(s): 1510 Problem Description 在纺织CAD系统开发过程中,经常会遇到纱线排列的问题。 Input 本题有多个测试数据组,第一行输入的就是数据组数N,接着就是N行表达式,表达式是按照前面介绍的意义书写的。 Output 输出时含有N行,每行对应一个输入的表达式。 Sample Input 2 1(1a2b1(ab)1c) 3(ab2(4ab)) Sample Output abbabc abaaaabaaaababaaaabaaaababaaaabaaaab |
要注意走每步所在字符的位置
#include <iostream>
#include <cctype>
#include <cstring>
#include <string>
using namespace std;
string s;
int fun(int ith)
{
int k,e;
char c;
for(c=s[ith++];ith<s.size()&&c!=')';c=s[ith++])//递归结束的条件是字符串结束或遇到右括号
{
for(k=0;isdigit(c);c=s[ith++]) //如果是数字,c就接着指向下一个字符的位置
k=c-'0';
if(!k) k=1;
if(c=='(')
{
while(k--)
e=fun(ith); //这里的ith是括号右面的字符位置,因为前面有ith++
ith=e;//重置ith的值,到下层递归结束的位置,即右括号的下一个字符的位置
}
else
{
while(k--)
putchar(c);
}
}
if(c==')') return ith;//返回本次读到结尾的位置,for循环结束退出时才会走到这里
}
int main()
{
int i,j,k,T;
cin>>T;
while(T--)
{
s.clear();
cin>>s;
fun(0);//进入递归
cout<<endl;
}
return 0;
}