32. Longest Valid Parentheses

更新 發佈閱讀 7 分鐘
https://leetcode.com/problems/longest-valid-parentheses?envType=problem-list-v2&envId=rabvlt31

這題我想在資工系茁壯成長的人一定不陌生,完全就是各種程式課程的回憶。

關於括弧的題目我也做過不少,一開始看到這題標 hard 想說哈哈我一定秒殺,括弧我已經熟到不能再熟了。結果實際下去跑,各種邊界條件我愣是搞不定。演算法換了八百種,程式碼越寫越長,這題大該花了四小時有吧😃

最終我寫了一個土法煉鋼篇暴力的程式碼,雖然只 beat 5%,但總算還是寫出來了。

class Solution {
public:
int longestValidParentheses(string s) {
std::stack<char> par;
std::stack<int> score;
vector<int> par_len;
int ans = 0;
int temp = 0;

for (char p: s) {
temp = 0;
if(p == '(') {
par.push('(');
score.push(0);
}
else if(!par.empty()) {
par.pop();
if(score.top() == 0) {
score.pop();
while (!score.empty() && score.top() != 0) {
temp += score.top();
score.pop();
}
temp += 2;
score.push(temp);
ans = max(ans, temp);
}
else {

while (!score.empty() && score.top() != 0) {
temp += score.top();
score.pop();
}
score.pop();
while (!score.empty() && score.top() != 0) {
temp += score.top();
score.pop();
}
temp += 2;
score.push(temp);
ans = max(ans, temp);
}

}
else {
while (!score.empty()) {
score.pop();
}
}

}

return ans;
}
};

有空再來談談我當時的腦迴路。

Best Solution

在點開討論區前,我已經做好被爆擊的準備了。畢竟這是一題經典的 stack 題目,我總是感覺他能夠被簡單的以 stack 化解,但我就是寫不出 AC 版本,歐嗚痛苦~

class Solution {
public:
int longestValidParentheses(string s) {
stack<int> st;
st.push(-1);
int max_len = 0;

for (int i = 0; i < s.length(); i++) {
if (s[i] == '(') {
st.push(i);
} else {
st.pop();
if (st.empty()) {
st.push(i);
} else {
max_len = max(max_len, i - st.top());
}
}
}

return max_len;
}
};

這都是些啥!!!只有 23 行!!!

驚呆了這個解法其實想法很簡單,不會很難知道他在寫什麼,卻很難自己想出來,leetcode 討論區是什麼聰明人的聚集地嗎?

抽象 high level 的去說,這個 i 指的是右括弧位置,st.top() 不是左括弧!因為左括弧被 pop 掉了 (line 12)。st.stop是指這整個合法的連續括弧的前一個不合法位置,所以用 i - st.top() 就是整個合法的長度!

太厲害了請收下我膝蓋。


留言
avatar-img
星星在晚上的時候不睡覺
0會員
13內容數
資工系的勞碌人生
2026/01/05
https://leetcode.com/problems/random-pick-with-weight?envType=problem-list-v2&envId=rabvlt31 這題我完全是土法煉鋼,因此跑出來的成績不好不意外哈哈哈。 class Solution { public:
2026/01/05
https://leetcode.com/problems/random-pick-with-weight?envType=problem-list-v2&envId=rabvlt31 這題我完全是土法煉鋼,因此跑出來的成績不好不意外哈哈哈。 class Solution { public:
2026/01/05
https://leetcode.com/problems/maximum-matrix-sum?envType=daily-question&envId=2026-01-05 這一題我願稱之為腦筋急轉彎之騙到我了。 經過了 542 的洗禮後,我看到每個題目都想了想是否可以用 queue 解。這
2026/01/05
https://leetcode.com/problems/maximum-matrix-sum?envType=daily-question&envId=2026-01-05 這一題我願稱之為腦筋急轉彎之騙到我了。 經過了 542 的洗禮後,我看到每個題目都想了想是否可以用 queue 解。這
2026/01/05
https://leetcode.com/problems/01-matrix?envType=problem-list-v2&envId=rabvlt31 熊熊發現最近我好像特愛暴力法...這題我的解法就是暴力破解,沒什麼含金量,程式碼又臭又長,beat 5%的 runtime and memo
2026/01/05
https://leetcode.com/problems/01-matrix?envType=problem-list-v2&envId=rabvlt31 熊熊發現最近我好像特愛暴力法...這題我的解法就是暴力破解,沒什麼含金量,程式碼又臭又長,beat 5%的 runtime and memo
看更多
你可能也想看
Thumbnail
最近 vocus 開放了一個新福利:考績優異的同事,可以申請遠端工作,公司還直接送一張機票。消息一出,全公司瞬間進入「旅遊準備模式🏖️」: 有人半夜在比價住宿,打開十幾個分頁算平均一晚到底要不要超過 2,000; 有人打開影片看「__城市一日生活費實測」; 也有人開始打開試算表,冷靜的敲著計
Thumbnail
最近 vocus 開放了一個新福利:考績優異的同事,可以申請遠端工作,公司還直接送一張機票。消息一出,全公司瞬間進入「旅遊準備模式🏖️」: 有人半夜在比價住宿,打開十幾個分頁算平均一晚到底要不要超過 2,000; 有人打開影片看「__城市一日生活費實測」; 也有人開始打開試算表,冷靜的敲著計
Thumbnail
題目 : 121. Best Time to Buy and Sell Stock
Thumbnail
題目 : 121. Best Time to Buy and Sell Stock
Thumbnail
題目 : 100. Same Tree
Thumbnail
題目 : 100. Same Tree
Thumbnail
題目 : 83. Remove Duplicates from Sorted List
Thumbnail
題目 : 83. Remove Duplicates from Sorted List
Thumbnail
題目 : 69. Sqrt(x)
Thumbnail
題目 : 69. Sqrt(x)
Thumbnail
題目 : 35. Search Insert Position
Thumbnail
題目 : 35. Search Insert Position
Thumbnail
題目 : 28. Find the Index of the First Occurrence in a String
Thumbnail
題目 : 28. Find the Index of the First Occurrence in a String
Thumbnail
題目:66. Plus One
Thumbnail
題目:66. Plus One
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News