题目链接: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)