獲取最長的有效括號子串
【題目】
給定乙個字串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開始 注意 還要從右向左遍歷!不然會漏掉...