題意:
求最長的合法的括號匹配的串長度。
思路:
如果把'('看做+1')'看做-1的話,一個合法的括號匹配序列表示成前綴和應該是+++0+++++0這種樣子,其中+表示前綴和>0。
爲了避免串的最後一部分出現+++0+++++0++++這種情況,我們可以正反掃兩次序列。
掃的過程就是維護一個sum表示前綴和,一個left表示當前合法序列的起點,每次sum<0的時候更新left,每次sum=0的時候嘗試更新答案。
時間複雜度O(n),空間複雜度O(1)。
代碼:
class Solution {
public:
int longestValidParentheses(string s) {
int n = s.size(), ans = 0;
int left = 0, pos = -1;
for (int i = 0; i < n; ++i) {
if (s[i] == '(') {
++left;
} else {
if (left > 0) {
--left;
if (left == 0) {
ans = max(ans, i - pos);
}
} else {
pos = i;
}
}
}
left = 0, pos = n;
for (int i = n - 1; i >= 0; --i) {
if (s[i] == ')') {
++left;
} else {
if (left > 0) {
--left;
if (left == 0) {
ans = max(ans, pos - i);
}
} else {
pos = i;
}
}
}
return ans;
}
};