题目34:消除括号
输入一个由括号括成的字符串,消除内部所有括号或是返回错误。
方案:
对字符串遍历一次,记录当前已路过的括号个数(step),初始为0,访问每个点时将当前访问点值赋给向前step的位置。时间复杂度o(n),空间复杂度1。同时记录左右括号数以便检查是否出错(出错的两种可能:1左右括号数目不符2右括号出现在与其配对的左括号之前)。顺便可以返回总括号对数。
代码:
1 int CutBracketsFromStr(char *str) 2 { 3 int i; 4 int len=strlen(str); 5 printf("Before test:%p\n",str); 6 int left=1,right=1,step=0;//外括号也是一组,算入计数不算入清除 7 if(str[0]!='('||str[len-1]!=')')//开头结尾不在括号内 8 return -1;//错误 9 for(i=1;i<=len-2;++i)//内部遍历 10 { 11 if(str[i]=='(')//遇到左括号 12 { 13 ++left; 14 ++step;//缩减步数+1 15 } 16 else if(str[i]==')')//遇到右括号 17 { 18 ++right; 19 if(right>left)//右括号先于与其配对的左括号出现 20 return -1;//错误 21 ++step;//缩减步数+1 22 } 23 else if(step!=0)//当前非左非右但已经需要向前缩减 24 str[i-step]=str[i]; 25 } 26 if(step!=0) 27 str[len-step-1]=str[len-1];//最后一个括号挪过去 28 if(left!=right)//左右括号数目不一致 29 return -1; 30 memset(str+len-step+1,0,step);//清空不要的内存区 31 str=realloc(str,len-step+1);//扔掉不要的内存区 32 printf("After test:%p\n",str); 33 str[len-step]='\0'; 34 return left;//返回括号对数 35 }
浙公网安备 33010602011771号