题意:
给一个字符串,讲简单紧凑的表达式展开,比如2(abc)表示abcabc
思路:
字符串的操作,这道题不涉及算法,但是这类题都是需要你仔细一点,将所有情况都考虑到
仔细读题,发现字符串只有数字、括号、小写字母
括号前遇到数字就记录,遇到前括号"("就找到相匹配的后括号")",然后一层层递归;
其实只需要输出字母,数字是限制,括号就递归;
但是wa了好几次,因为我没有考虑到 a(s)d2(sd) 这种"()"并列的情况……
代码:
#include <iostream>
#include <stdlib.h>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cstring>
//notice ()()
using namespace std;
int len = 0;
const int INF = 0x3fffffff;
const int MAXN = 250000+10;
const int MAXM = 1000+10;
const int MAXK = 250+10;
char arr[MAXK]; //original array 原始数组
char re[MAXN]; //final array 最终数组
void my_find(int st, int en){
int i, j;
int num = 0;
for(i=st; i<=en; i++){
if(arr[i]>='0' && arr[i]<='9'){
num = num*10 + arr[i]-'0';
}
else if(arr[i]>='a' && arr[i]<='z'){
if(num==0) {re[len++] = arr[i]; continue;}
while(num--){
re[len++] = arr[i];
}
num = 0;
continue;
}
else if(arr[i] == '('){
int tmp = 1;
for(j=i+1; j <=en; j++){
if(arr[j]=='(') tmp++;
if(arr[j]==')') tmp--;
if(!tmp){
if(num==0) num=1;
while(num--){
my_find(i+1, j-1);
}
i = j;
num = 0;
break;
}
}
}
}
}
int main(){
int n;
scanf("%d", &n);
while(n--){
len = 0;
scanf("%s", arr);
memset(re, 0, sizeof(re));
my_find(0, strlen(arr)-1);
puts(re);
}
return 0;
}
/*
10
a2(s3(a2b)a1a)
a(b)s2(as)
3(ab2(4ab))
1(1a2b1(ab)1c)
*/
反思:
还是不够细心的锅,几个测试样例在代码中奉上