python 最長公共子括號序列

2021-09-26 11:09:12 字數 1355 閱讀 1622

思路:

求取和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)

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:

return not tmp

#4.計算s4中合法t的個數

cnt = -1

for sub in s4:

if valid(sub):

cnt += 1

print(cnt)

網易 最長公共子括號序列

乙個合法的括號匹配序列被定義為 1.空串 是合法的括號序列 2.如果 x 和 y 是合法的序列,那麼 xy 也是乙個合法的括號序列 3.如果 x 是乙個合法的序列,那麼 x 也是乙個合法的括號序列 4.每個合法的括號序列都可以由上面的規則生成 例如 都是合法的。從乙個字串s中移除零個或者多個字元得到...

python 最長公共子串行

usr bin env python3 coding utf 8 最長公共子串行 fish fosh fsh def findlongestsubstring source,dest 輸入值,要比較的值 inlen len source outlen len dest target cell 0 f...

最長公共子串行 最長公共子串

1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...