括號字串的有效性和最長有效長度

2021-10-02 04:44:11 字數 2408 閱讀 3691

給定乙個字串s,判斷是不是整體有效的括號字串。

例如:

遍歷字串,記錄待匹配的』(『的個數count,遇到』(』, count += 1,遇到』)』, count -= 1,如果過程中count < 0,返回false。遍歷完成,且count恰好為0,返回true

def

is_valid

(s):

if s is

none

orlen

(s)<2or

len(s)%2

!=0:return

false

count =

0for c in s:

if c notin(

'(',

')')

:return

false

if c ==

')':

count -=

1if count <0:

return

false

else

: count +=

1return count ==

0

給定乙個括號字串,返回最長的有效括號子串長度。

例如:

動態規劃:

如果s[i] == 『)』, 令prev = i - dp[i-1] - 1,如果s[prev] == 『(』,

dp[i] = dp[i-1] + 2

如果prev >= 1:

dp[i] += dp[prev-1]

def

max_valid_length

(s):

if s is

none

orlen

(s)==0:

return

0 dp =[0

]*len(s)

for i in

range(1

,len

(s))

:if s[i]

==')'

: prev = i - dp[i-1]

-1if prev >=

0and s[prev]

=='('

: dp[i]

= dp[i-1]

+2+(dp[prev-1]

if prev >=

1else0)

return

max(dp)

def

test_is_valid()

:assert

(is_valid('')

isfalse

)assert

(is_valid(

'(')

isfalse

)assert

(is_valid(

')')

isfalse

)assert

(is_valid(

'()')is

true

)assert

(is_valid(

'()()')is

true

)assert

(is_valid(

'(())')is

true

)assert

(is_valid(

'(()())')is

true

)assert

(is_valid(

')((())')is

false

)assert

(is_valid(

'())(')is

false

)print

('pass'

)def

test_max_valid_length()

:assert

(max_valid_length(

'(())')==

4)assert

(max_valid_length(

'())')==

2)assert

(max_valid_length(

'(()')==

2)assert

(max_valid_length(

'(()())')==

6)assert

(max_valid_length(

'()(()()(')==

4)print

('pass'

)if __name__ ==

'__main__'

: test_is_valid(

) test_max_valid_length(

)

牛客網-括號字串的有效性

牛客網-括號字串的最長有效長度

括號字串的有效性和最長有效長度

獲取最長的有效括號子串 題目 給定乙個字串s,判斷是不是整體有效的括號字串。舉例 s 返回true s 返回true s 返回true。s 返回false s 返回false s a 返回false。演算法思路 整體有效的括號字串是指匹配的圓括號弧 無其他括號 遍歷整個字串s 若遇到除 和 之外的字...

字串問題之 括號字串的有效性和最長有效長度

給定乙個字串 str,判斷是不是整體有效的括號字串 str true str a false 高階題目 給定乙個括號字串str,返回最長的有效括號子串 首先原問題的解決思路 各種判斷 遍歷判斷每個字元是不是 或 如果不是,false 遍歷到每乙個字元時,都檢查到目前為止 和 的數量,如果 多 返回f...

字串 最長有效括號

給定乙個只包含 和 的字串,找出最長的包含有效括號的子串的長度。示例 1 輸入 輸出 2 解釋 最長有效括號子串為 示例 2 輸入 輸出 4 解釋 最長有效括號子串為 思路 記錄左右括號的個數 相等了就比較更新答案 如果count2 count1 就結算 從0開始 注意 還要從右向左遍歷!不然會漏掉...