LeetCode 32 最長有效括號

2022-07-10 16:54:10 字數 1870 閱讀 9847

leetcode

acwing

題解演算法1

兩遍線性掃瞄+貪心\(o(n)\)

線性掃瞄一遍字串,設定sum = 0,假如是(,就+1,假如是),就-1;計算完之後判斷一下當前的和,如果sum == 0說明是有效字串,統計一下結果。如果是sum < 0說明)太多了,這種情況無論我們輸入什麼都沒法形成有效匹配,如果是sum > 0,說明(太多了,這種情況我們輸入),是可以生成有效匹配的。

但是只是這樣的話,有一種情況會覆蓋不到,那就是掃瞄到最後,sum > 0,但是字串裡確實有有效串。如...(((()((,最中間的有效匹配會匹配不到。所以我們逆向思維,將整個過程反著來一遍就行了。

時間複雜度

\(o(n)\)

空間複雜度

\(o(1)\)

class solution 

start = s.size()-1, sum = 0;

for (int i = s.size()-1; i >= 0; i --)

return res;}};

演算法2

(動態規劃)\(o(n)\)

時間複雜度

\(o(n)\)

空間複雜度

\(o(n)\)

class solution 

else}}

int res = 0;

for (int i = 0; i < n; i ++) res = max(res, f[i]);

return res;}};

tip寫動規一定要注意轉移方程、條件各個地方的下標!

演算法3棧 \(o(n)\)

用棧來維護字串中待匹配的(,用start來記錄當前可能形成最長合法字串的起始位置。

當當前輸入的字串為(時,直接入棧

當輸入),但是棧為空,說明不會再有輸入能合法化目前的字串,更新start = i + 1

當輸入),但是棧不為空,棧頂元素出棧,若之後棧為空,說明找到了乙個完全合法的子串,更新一下答案res=max(res, i - start + 1);若之後棧不為空,說明找到了乙個部分合法的子串,更新一下答案為res = max(res, i - st.top())

時間複雜度

每個元素最多隻會入棧出棧一次,因此是\(o(n)\)

空間複雜度

\(o(n)\)

class solution  }}

return res;}};

tip更進一步想,演算法1是不是演算法2更進一步思考的結果?演算法2中棧的元素,假如我們也按演算法1給它計算一下,是不是也是滿足相應的關係?

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...