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

2021-10-03 10:49:16 字數 3673 閱讀 4338

獲取最長的有效括號子串

【題目】

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

【舉例】

s = 「()」,返回true;

s = 「(()())」,返回true;

s = 「(())」,返回true。

s = 「())」。返回false;

s = 「()(」,返回false;

s = 「()a()」,返回false。

演算法思路

整體有效的括號字串是指匹配的圓括號弧"()",無其他括號

遍歷整個字串s

若遇到除』(『和』)『之外的字元,直接返回false

more意為右圓括弧』)『比左圓括弧』(『多出的數量,若遇到』)』,more加1,若遇到』(』,more減1,若more > 0直接返回false

遍歷結束後,若左右圓括弧數量不相等(more != 0)返回false,否則返回true

整個過程遍歷整個字串s,沒有申請開闢額外空間,因此演算法時間複雜度為o(n

)o(n)

o(n)

,空間複雜度為o(1

)o(1)

o(1)

。相應**

# 是否為整體有效的括號字串

defis_valid_par

(s):

if s is

none

orlen

(s)==0:

return

false

more =

0for i in

range

(len

(s))

:if s[i]

!='('

and s[i]

!=')'

:return

false

elif s[i]

=='('

: more +=

1else

: more -=

1if more <0:

return

false

if more ==0:

return

true

else

:return

false

# 簡單測試

if __name__ ==

'__main__'

:print

(is_valid_par(

"()"))

# true

print

(is_valid_par(

"(()())"))

# true

print

(is_valid_par(

"(())"))

# true

print

(is_valid_par(

"())"))

# false

print

(is_valid_par(

"()("))

# false

print

(is_valid_par(

"()a()"))

# false

【補充題目】

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

【舉例】

s = 「(()())」,返回6;

s = 「())」,返回2;

s = 「()(()()(」,返回4。

演算法思路

動態規劃,dp[i]表示以i結尾的有效括號子串最大長度

若dp[i-1]無有效匹配(dp[i-1]=0),則比較s[i]s[i-1]是否匹配為圓括號(s[i-1]='(',s[i]=')'),e.g. 「(

)(())」,加粗的表示匹配的圓括號,帶下劃線為比較的兩個字元;

若dp[i-1]有最長匹配,則比較判斷s[i]s[pre]是否匹配為圓括號,其中pre = i - dp[i - 1] - 1,e.g. 「()(())」;

因此綜合兩者,則比較判斷s[i]s[pre]是否匹配為圓括號,其中dp[i] = dp[i-1]+2

最容易讓人疏忽的是s[i]s[pre]匹配為圓括號,還要加上pre-1的最大匹配子串長度dp[i]+=dp[pre-1],e.g. "()(());

遍歷整個字串s,獲取最長的有效括號子串長度返回。

整個過程遍歷整個字串s,申請開闢額外空間dp,因此演算法時間複雜度為o(n

)o(n)

o(n)

,空間複雜度為o(n

)o(n)

o(n)

。相應**

# 獲取最長的有效括號子串

defget_max_len

(s):

if s is

none

orlen

(s)==0:

return

0# dp[i]表示以i結尾的有效括號子串最大長度

dp =[0

for i in

range

(len

(s))

] max_len =

0for i in

range(1

,len

(s))

:if s[i]

==')'

: pre = i - dp[i -1]

-1if s[pre]

=='('

: dp[i]

= dp[i -1]

+2if pre >1:

dp[i]

+= dp[pre -1]

if dp[i]

> max_len:

max_len = dp[i]

return max_len

# 簡單測試

if __name__ ==

'__main__'

:print

(get_max_len(

"(()())"))

# 6print

(get_max_len(

"())"))

# 2print

(get_max_len(

"()(()()("))

# 4print

(get_max_len(

"()(())"))

# 6

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

給定乙個字串s,判斷是不是整體有效的括號字串。例如 遍歷字串,記錄待匹配的 的個數count,遇到 count 1,遇到 count 1,如果過程中count 0,返回false。遍歷完成,且count恰好為0,返回true def is valid s if s is none orlen s 2...

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

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

字串 最長有效括號

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