給定乙個只包含 『(』 和 『)』 的字串,找出最長的包含有效括號的子串的長度。
示例 1:
輸入: 「(()」
輸出: 2
解釋: 最長有效括號子串為 「()」
示例 2:
輸入: 「)()())」
輸出: 4
解釋: 最長有效括號子串為 「()()」
class solution:
def longestvalidparentheses(self, s: str) -> int:
def test(temp1):
left2=0
right2=0
for j in temp1:
if j=='(':
left2+=1
else:
right2+=1
if left2max_len :
max_len=len(temp1)
return max_len
這道題一開始我的思路,是先遍歷一遍比如遍歷到i時我們就來尋找以s[i]為結尾的有效括號子串的長度。
剛開始我尋找的思路是對以s[i]結尾的子串進行兩道排查
1.首先在前面我統計了「(」和「)」的個數,分別為left和right,然後我們在該字串不停的踢出串首字元,同時記錄left和right
2.當他們相等時我們需要進行第二道判斷,即從頭讀取一遍該刪減過的字串看看是否會出現left int:
n=len(s)
dp=[0]*n
max_len=0
for i in range(n):
if s[i]=='(':
dp[i]==0
elif i-dp[i-1]-1==0and s[0]=='(':
dp[i]=dp[i-1]+2
elif i-dp[i-1]-1>0and s[i-dp[i-1]-1]=='(':
dp[i]=dp[i-1]+2+dp[i-dp[i-1]-2]
if dp[i]>max_len:
max_len=dp[i]
return max_len由於上一種方法的時間複雜度不符合要求,我們倆用時間換空間,我的想法是當我們遍歷到i時我們要判斷以s[i]為串尾的有效字串的長度時,我們可以利用之前儲存的j"("那麼肯定不存在以s[i]結尾的有效子字串
如果是s[i]")"
我們發現公式dp[i]=dp[i-1]+2+dp[i-dp[i-1]-2]
而當 i-dp[i-1]-1==0時由於dp[i-dp[i-1]-2]不存在所以單獨考慮,但由於dp[-1]等於零後來我又把他們這兩種情況結合到了一起
即
class solution:
def longestvalidparentheses(self, s: str) -> int:
n=len(s)
dp=[0]*n
max_len=0
for i in range(n):
if s[i]==')':
# if i>0and s[i-1]=='(':
# dp[i]=dp[i-2]+2
if i-dp[i-1]-1>=0and s[i-dp[i-1]-1]=='(':
dp[i]=dp[i-1]+2+dp[i-dp[i-1]-2]
if dp[i]>max_len:
max_len=dp[i]
return max_len
class solution:
def longestvalidparentheses(self, s: str) -> int:
n=len(s)
dp=[0]*n
max_len=0
for i in range(n):
if s[i]==')':
if i>0and s[i-1]=='(':
dp[i]=dp[i-2]+2
elif i-dp[i-1]-1>=0and s[i-dp[i-1]-1]=='(':
dp[i]=dp[i-1]+2+dp[i-dp[i-1]-2]
if dp[i]>max_len:
max_len=dp[i]
return max_len
還有一種思路是,建立乙個棧然後進行遍歷,假如s[i]"(",則在棧中記錄乙個點位等待「)」與其配對
如果s[i]")「那麼我們需要從棧中將與s[i]最近的記錄的點刪除,表示這之間是有效括號子串,並且記錄該長度。
由於假如s[i]")"我們就需要從棧中踢出乙個與其對應的點,而當棧中沒有與其對應的點的時候即stack為空的時候我們就無法踢出元素了或者假如前面所有的「(」都被消耗完了,這時候我們找不到乙個標準來計算出i與最近刪除的點之間的長度,wile解決這個問題我們設定乙個初始的量度-1
還有當我們stack中只剩下-1而且是s[i]」)"那麼我們需要將-1踢出並且使i成為新的那個量度因為不存在以「)」開頭的有效括號。
最長有效括號
leedcode32 給定乙個只包含 和 的字串,找出最長的包含有效括號的子串的長度。示例 1 輸入 輸出 2解釋 最長有效括號子串為 示例 2 輸入 輸出 4解釋 最長有效括號子串為 思路 首先生成乙個長度和s一樣的陣列dp,dp i 表示以i結尾的字元的最長有效括號子串長度。顯然dp 0 0 假...
最長有效括號
給定乙個只包含 和 的字串,找出最長的包含有效括號的子串的長度。示例 1 輸入 輸出 2解釋 最長有效括號子串為 示例 2 輸入 輸出 4解釋 最長有效括號子串為 思路 解法1 借助棧 借助棧來求解,需要定義個start變數來記錄合法括號串的起始位置,我們遍歷字串,如果遇到左括號,則將當前下標壓入棧...
最長有效括號
給定乙個只包含 和 的字串,找出最長的包含有效括號的子串的長度。輸入 輸出 2 解釋 最長有效括號子串為 輸入 輸出 4 解釋 最長有效括號子串為 用陣列dp i 表示括號串s i 結尾的最大括號字串長度。當 s i 是 時,dp i 一定為0。當s i 為 時,判斷s i 1 是否為 s i 1 ...