【python】最长公共子括号序列

题目链接:https://www.nowcoder.com/practice/504ad6420b314e5bb614e1684ad46d4d

思路:

求取和s拥有公共最长子序列的t的个数,那么最长子序列元素个数就是len(s)-1,所以就通过将s的元素(除首尾外,因为合法元素首尾肯定是左右括号)逐个pop出来再在各个位置insert回去,得到一系列的t(这些t只要合法,那肯定就和s有最长公共子序列,长度为(len(s)-1))后;判断这些t是否合法,再输出合法t的数量即可

读取括号序列后:
1.经过一系列pop和insert操作生成s3(元素换位后生成的所有t的列表)
2.去除重复的t及原始s0后得到s4
3.判断s4中t的合法性并计算s4中合法t的个数

s0 = list(input())
l = len(s0)

#s0 原始括号序列
#s1 原始括号序列的备份:会被pop掉一个元素
#s2 备份被pop掉一个元素的s1后再在自身的各个位置insert一个元素
#s3 包含所有得到的t
#s4 筛选出不重复的且与原始s0不同的t

#1.经过一系列pop和insert操作生成s3(元素换位后生成的所有t的列表)
s3 = []
#遍历s0中各元素,把每个元素都拿出来并插入新位置(这里是所有位置都插了,
#因为后面反正会判断重复性),
for i in range(l):
    s1 = s0.copy() # 每次循环都要从原始的s0拿出一个元素,所以s0要保留
    s = s1.pop(i)
    for j in range(l): # 按照原来s0 的位置信息在各个位置插入刚刚pop出来的a
        s2 = s1.copy() # 每次循环都要往s1插入一个元素,所以s1要保留
        s2.insert(j,s) 
        s3.append(''.join(s2)) # 生成新的t并加入到元素为t的s3中
        s2 = s1.copy() # 重新初始化新的s2

#2.去除重复的t及原始s0后得到s4        
s4 = set(s3)

#3.判断s4中t的合法性【是否为有效括号串】
def valid(s):
    if not s:
        return False
    tmp = []
    for i in range(len(s)):
        if s[i] == ')':
            if not tmp or tmp[-1] != '(':
                return False
            else:
                tmp.pop()
        else:
            tmp.append(s[i])
    return not tmp

#4.计算s4中合法t的个数
cnt = -1
for sub in s4:
    if valid(sub):
        cnt += 1
print(cnt)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值