插入最少字符使得只含数字,+,(,)的算式合法化

本文探讨了在给定字符集下生成合法序列的方法,特别关注于如何通过合理地添加括号来确保序列的合法性。文章详细介绍了处理括号配对的基本策略,并提出了一种针对非法符号对的解决方法,旨在简化序列生成过程。

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

比如输入  2(+(5+1( ) ,那么 2+(1+(5+1+(1)))  是一种解法。

注意:插入的也只能是这4种字符。 ( )非法,((12))合法


这里提供一个思路,就是首先处理括号,再处理其它;并且添加的括号只加在开头和结尾;这样做是基于以下的事实:

1. 在中间加入括号可能产生新的非法串,如 “)(” ,在首尾则不会;

2. 在中间加括号无法使得修改步数更少。

具体的,分别统计出所有左括号和右括号的个数,以及成功配对的个数,剩下的就是需要我们添加括号来配对;对每一个多出的右括号,在最左端添加等数量的左括号;对多出的左括号做相同处理。


处理好了括号配对后,就要考虑其它的合法问题,具体如何做?

一种方法是考虑非法的符号对,所有的配对组合为 A(2,4) = 12,其中非法的配对如下:

1. num:(

2.  +   : )

3. (   : + or )

4.  )  :num or (

这些非法串都只有唯一的修改方法,即添加 num 或者 + ;并不用再管正反括号。

读者可以思考为什么考虑两两组合的非法串,而不是考虑某种符号后面接什么会产生非法串。


大致代码如下:

int main(void){
	cin>>str;
	int lnum,rnum;
	lnum=rnum=0;
	for(char*p=str;*p;p++){
		if(*p=='(')
			lnum++;
		else if(*p==')'){
			if(lnum>0)
				lnum--;
			else
				rnum++;
		}
	}
	int j=0;
	for(int i=0;i<rnum;i++)
		s[j++] = '(';
	// handle illegal sequence
	// ......
	for(int i=0;i<lnum;i++)
		s[j++] = ')';
	s[j++]=0;
	cout<<s<<endl;
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值