[字符串操作]poj 1274 展开字符串

poj 1274 展开字符串

题意:

给一个字符串,讲简单紧凑的表达式展开,比如2(abc)表示abcabc

思路:

字符串的操作,这道题不涉及算法,但是这类题都是需要你仔细一点,将所有情况都考虑到

仔细读题,发现字符串只有数字、括号、小写字母

括号前遇到数字就记录,遇到前括号"("就找到相匹配的后括号")",然后一层层递归;

其实只需要输出字母,数字是限制,括号就递归;

但是wa了好几次,因为我没有考虑到 a(s)d2(sd) 这种"()"并列的情况……

代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
//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)
*/


反思:

还是不够细心的锅,几个测试样例在代码中奉上

你可能感兴趣的:(无算法)