(每日一练)题目名称:括号匹配

文盲老顾
WEB应用领新星创作者
博客专家认证
2023-06-27 13:07:15

有四种括号:大括号{}、中括号[]、小括号()和尖括号<>。它们之间不能错套,且需要配对。 错套的意思是:某种括号的前半部分和后半部分之间,仅套着不同类括号的某一半部分而没有另一半部分。错套的样例如下: <<<>>{>([hello[]]}){world} 因为在尖括号的前半部分和后半部分之间,仅套着大括号的前半部分而没有后半部分。 配对的意思是:如果出现了某种括号的前半部分,则必须在之后有同样数量的同类括号的后半部分与之对应;反之如果出现了某种括号的后半部分,则必须在之前有同样数量的同类括号的前半部分与之对应。正确的配对样例如下: <<<>>>({[hello[]]}){world} 错误的配对样例如下: ))<<<>>([hello[]]){world} 因为前2小括号只有后半部分而缺失了前半部分,而尖括号的前半部分有3个,而后半部分只有2个。

单行文本(字符数小于100000)。

如果括号正确匹配(即不存在错套且都正确配对),则按大、中、小、尖的顺序输出实际存在的各类括号的数量(如果不存在就不输出)。
格式形如: 20[]6<>
以上输出代表括号正确匹配,且没有大括号、有20对中括号、没有小括号、有6对尖括号。如对于描述中正确的配对样例应该输出: 2{}2[]1()3<>
如果存在错套,则输出第一处错套的前后半个括号,并附一个感叹号(!)。如对于描述中错套的样例应该输出: {>!
如果不存在错套,但存在错误的配对,则大、中、小、尖各自前半部分在先、后半部分在后的顺序输出缺少的括号数量(不输出正确匹配的括号数量)。
格式形如: 4}7(9)16<
以上输出代表不存在错套,但存在错误的配对,其中有4对大括号只有前半部分而缺少后半部分,有7对小括号只有后半部分而缺少前半部分、有9对小括号只有前半部分而缺少后半部分、有16对尖括号只有后半部分而缺少前半部分。如对于描述中错误的配对样例应该输出: 2(1>

又一个新题目,这个题目倒是能直接AC,但是。。。。这是阅读理解题,要仔细阅读输出格式,如果格式有问题,那就只能 60% pass 了。

为了避免干扰周赛,暂时先不放代码。

...全文
236 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
文盲老顾 2023-06-29
  • 打赏
  • 举报
回复 1

现在放出来比赛时的代码,嗯,前边那一版其实也不是最初版本,而是减少 if 的版本,这一版 if 用的就多了点,包括推导式里的,以及用 or 代替的,算是应该有10个 if 分支了

s = input()
c,p = '{}[]()<>',[]
t = ['','','']
for i in s:
    if i not in c:continue
    elif c.index(i) % 2 == 0:p.append(i)
    elif len(p) == 0:t[1] += c[c.index(i) ^ 1]
    elif p[-1] == c[c.index(i) ^ 1]:t[2] += p.pop()
    else:
        t[0] = p.pop() + i + '!'
        break
t[1] += ''.join([c[c.index(v) ^ 1] for v in p])
t[1] = ''.join([str(t[1].count(v)) + v for v in c if t[1].count(v) > 0])
t[2] = ''.join([str(t[2].count(v)) + v + c[c.index(v) ^ 1] for v in c if t[2].count(v) > 0])
print(t[0] or t[1] or t[2])
文盲老顾 2023-06-28
  • 打赏
  • 举报
回复 1

先来个预习版的,放心,和我今天周赛提交的内容,只有思路一样,写法完全不一样

import re
s = re.sub(r'[^\{\}\[\]\(\)<>]','',input())
st,stack = '{}[]()<>',[]
t = ['',st,st]
for i in s:
    if st.index(i) % 2 == 0:
        stack.append(i)
    elif len(stack) == 0:
        i = st[st.index(i) ^ 1]
        t[1] = re.sub('\\d*\\' + i,str(int('0' + re.search('\\d*(?=\\' + i + ')',t[1]).group(0)) + 1) + i,t[1])
    elif stack[-1] == st[st.index(i) ^ 1]:
        i = stack.pop()
        t[2] = re.sub('\\d*\\' + i,str(int('0' + re.search('\\d*(?=\\' + i + ')',t[2]).group(0)) + 1) + i,t[2])
    else:
        t[0] = stack.pop() + i + '!'
        break
for i in set(stack):
    t[1] = t[1].replace(st[st.index(i) ^ 1],str(stack.count(i)) + st[st.index(i) ^ 1])
t[1] = re.sub('(?<!\d)[\{\}\[\]\(\)<>]','',t[1])
t[2] = re.sub('(?<!\d)(\\{\}|\[\]|\(\)|<>)','',t[2])
print(t[0] or t[1] or t[2])

321

社区成员

发帖
与我相关
我的任务
社区描述
主要用于技术交流,包括但不限于 .net,mssql,js,css,python,算法,运维。也可以晒最新技术,美图,运动等。最后,如果有问题,可以提问,老顾能帮忙的会尽量帮忙哦。
前端sqlserverasp.net 技术论坛(原bbs) 北京·西城区
社区管理员
  • 文盲老顾
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧