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