消除嵌套的括号 clear brace in string

来源:互联网 发布:手机淘宝没有了淘抢购 编辑:程序博客网 时间:2024/06/17 08:40

题目源自于百度公司2014校园笔试的一道字符串题。

题目:给定一个如下格式的字符串(1,(2,3),(4,(5,6),7))括号内的元素可以是数字,也可以是另一个括号,请实现一个算法消除嵌套的括号,比如把上面的表达式变成:(1,2,3,4,5,6,7),如果表达式有误请报错。


思路:希望算法所占空间越小越好。做到不用栈来匹配括号、不用临时数组来存储新字符串。

空间上:

在括号匹配的逻辑上,遇到左括号入栈,遇到右括号出栈,这里只用一个int来表示当前“虚拟栈”中的元素个数,而不是真的用栈。当栈中元素个数为负,则不符合逻辑,即匹配出错。

因为字符串元素只删不增。这里用两个指针来原地转换。旧字符串和新字符串都是原地字符串。

时间上:

顺序扫描字符串一遍。


代码:

#include <stdio.h>int clear_brace(char *str){if(str == NULL)return -1;char *a,*b;int num = 0;a = b = str;if(*a == '('){a++;b++;num++;}elsereturn -1;while(*(a+1) != '\0'){if(*a == '('){num++;a++;}else if(*a == ')'){num--;if(num < 1)return -1;a++;}else{*b = *a;a++;b++; }}if(*a == ')' && num == 1){*b = *a;*(b+1) = *(a+1);}elsereturn -1;return 1;}int main(){char a[] = "(1,(2,3),(4,(5,6),7))";printf("%d\n", clear_brace(a));printf("%s\n", a);return 1;}


注意:别忘记检查最后“栈”中是否是空,即完全匹配。



原创粉丝点击