题目源自于百度公司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++;
}
else
return -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);
}
else
return -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;
}
注意:别忘记检查最后“栈”中是否是空,即完全匹配。