括号序列(不算东方化的改题+???)

【问题描述】

众所周知,东方众说话喜欢打一半括号,比如说这样(

但是有人觉得这样别人看不明白,所以想要设计一个程序来帮他们补上括号。

定义如下规则序列(字符串):

1.空序列是规则序列;

2.如果S是规则序列,那么(S)和[S]也是规则序列;

3.如果A和B都是规则序列,那么AB也是规则序列。

例如,下面的字符串都是规则序列:

(),[],(()),([]),()[],()[()]

而以下几个则不是:

(,[,],)(,()),([()

现在,给你一些由‘(’,‘)’,‘[’,‘]’构成的序列,你要做的,是找出一个最短规则序列,使得给你的

那个序列是你给出的规则序列的子列。(对于序列a1a2,…,和序列blb2,…,,如果存在一

组下标1≤i1<i2<…<≤m,使得aj=对一切1≤j≤n成立,那么a1a2…,就叫做b1b2,…,的子列。

【输入】

输入文件仅一行,全部由‘(’,‘)’,‘]’,‘]’组成,没有其他字符,长度不超过100。

【输出】

输出文件也仅有一行,全部由‘(’,‘)’,‘]’,‘]’组成,没有其他字符,把你找到的规则序列输出即可。

因为规则序列可能不止一个,因此要求输出的规则序列中嵌套的层数尽可能地少。

 

老师给的题解:

对于输入的括号序列字符串,从左向右进行查找,用一个数组来记录查找配对的情况,如果一个括

号有相应的括号跟它对应,则将它标记为0,如果没有相应的括号跟它对应,则保存原子始代码的

编号,“[]”分别为-1和1,“()”分别为-2和2。

因此对于读入的字符串,首先将其转换为相应的代码存放到数组里,为后面查找匹配做准备。

查找匹配时,可用这样的方法:

如果当前的字符是右括号,则跟前面的一个没有匹配的左括号对照,看是否匹配,如果匹配,则将

两个字符标记为0,查找并定位到左边的第一个没有匹配的左括号(如果有的话)。如果当前的字符是

左括号,则记住这个不匹配的左括号的位置,为后面找到右括号时匹配做准备。

从第一个字符开始到最后一个字符重复上面的过程,检查处理完毕。

输出时考虑到不增加嵌套的层数,以就近的原则,将出现不匹配的一个括号时,输出两个匹配的括号。

跟我思路差不多

代码我没写出来

转载于:https://www.cnblogs.com/aristocrat/p/8472398.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值