导航

编程题目记录131217:题目34 消除括号

Posted on 2013-12-17 14:38  生存在夹缝中  阅读(251)  评论(0)    收藏  举报

题目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 }