消除嵌套的括号 clear brace in string

本文介绍了一种高效算法,用于将含有嵌套括号的字符串转换为扁平化的字符串形式,例如将'(1,(2,3),(4,(5,6),7))'转换为'(1,2,3,4,5,6,7)'。该算法通过巧妙使用指针而非栈来减少内存消耗,并确保括号正确匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目源自于百度公司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;
}


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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值