題目:32. 最長有效括號鏈結
思路:
方法一:棧
看到括號匹配問題首先想到棧,這題求連續匹配的括號長度,因此我們首先想到如何指定彈棧,入棧的規則。
首先 需要明確棧中存的是下標,並不是元素值
s.
push(-1);
-1為了 後面計算maxlen方便進行的, 不用擔心越界問題,因為-1下標,並不會直接使用。
入棧規則 :代表著等待彈出
if
(str[i]
=='('
)
出棧規則:這代表著經過出棧後,
1.原棧中若是空,則代表著不用更新元素maxlen值,直接將i入棧,入棧後,棧不為空
2.棧中不為空,那麼也就是說,剛才直接彈出棧的是str[i]=』(』,,又找到一隊匹配括號,然後我們可以更新maxlen的值。
if
(str[i]
==')'
)
方法二:正向遍歷,逆向遍歷遍歷兩次,空間複雜度是o(1) 存在兩個變數 乙個記錄左括號個數,乙個記錄右括號個數
1.正向遍歷時
保證左括號個數大於等於右括號個數 相等時更新maxlen
2.逆向遍歷 保證左括號個數小於等於右括號個數 相等時更新maxlen
方法三:動態規劃
**:
方法一
class
solution
else
if(str[i]
==')'
)else}}
return maxlen;}}
;
方法二
class
solution
else
if(str[i]
==')'
)else
if(rightcount>leftcount)
//已經不連續了}}
//下面就是逆向遍歷了。改改
leftcount=0;
rightcount=0;
for(
int i=str.
size()
-1;i>=
0;i--
)//逆向
else
if(str[i]
=='('
)else
if(rightcount>leftcount)
//已經不連續了}}
return maxlen;}}
;
LeetCode 32 最長有效括號
思路 自己沒想出來,參考了一下網上大神的提示。使用乙個int棧,將左括號記為 1,右括號記為 2 遍歷字串。1.若為 則直接壓入棧 2.若為 分情況討論 若棧頂為 2 或棧空,則直接將 2壓入棧 若棧容量為1,且棧頂為 1,將 1推出棧,推入2,代表此時有一對匹配括號 若棧容量為1,且棧頂大於0,說...
leetcode 32 最長有效括號
一 先對字串進行遍歷 首先從前往後排除不配對的 首次遍歷後的字串被分成若干個字串 再對這些字串 從後往前排除不配對的 int longestvalidparentheses std string s else if s j else t1 j 1 n 0 continue if max2 n max...
LeetCode32 最長有效括號
題目鏈結 500 800ms class solution else if s j for int i 0 ilength i if s i 0 result 0 if result k return result else return k 這絕不是最優解 幾十毫秒之內解決問題 class sol...