原题题目
代码实现(首刷自解)
class Solution {
public:
int longestValidParentheses(string s) {
stack<int> intstack,tempstack;
int ret = 0,temp = 0,charstack = 0;
for(const auto& chr:s)
{
if(chr == '(')
{
intstack.emplace(-1);
++charstack;
}
else
{
if(!charstack)
{
intstack = tempstack;
continue;
}
else
{
--charstack;
auto temp = 2;
while(!intstack.empty() && intstack.top() != -1)
{
temp += intstack.top();
intstack.pop();
}
intstack.pop();
while(!intstack.empty() && intstack.top() != -1)
{
temp += intstack.top();
intstack.pop();
}
ret = max(temp,ret);
intstack.emplace(temp);
}
}
}
return ret;
}
};
代码实现(二刷自解 DAY 286 C++ 空间复杂度稍高)
class Solution {
public:
int longestValidParentheses(string s) {
stack<char> chrstack;
stack<int> intstack;
int ret = 0;
for (const auto chr : s) {
if (chr == ')') {
if (chrstack.empty() || chrstack.top() == ')') {
{
stack<char> tmpchr;
stack<int> tmpint;
chrstack.swap(tmpchr);
intstack.swap(tmpint);
}
continue;
}
chrstack.pop();
int tmp = intstack.top();
intstack.pop();
if (tmp != 0) intstack.pop();
tmp += 2;
while (!intstack.empty() && intstack.top() != 0) {
intstack.top() += tmp;
tmp = intstack.top();
intstack.pop();
}
intstack.emplace(tmp);
ret = max(ret, intstack.top());
} else {
intstack.emplace(0);
chrstack.emplace(chr);
}
}
return ret;
}
};
代码实现(三刷自解 DAY 286 C++)
class Solution {
public:
int longestValidParentheses(string s) {
stack<int> intstack;
int ret = 0, chrstack = 0;
for (const auto chr : s) {
if (chr == '(') {
intstack.emplace(0);
++chrstack;
} else {
if (chrstack == 0) {
stack<int> tmp;
intstack.swap(tmp);
continue;
}
--chrstack;
int tmp = intstack.top() + 2;
intstack.pop();
if (tmp != 2) {
intstack.pop();
}
while (!intstack.empty() && intstack.top() != 0) {
tmp = intstack.top() + tmp;
intstack.pop();
}
intstack.emplace(tmp);
ret = max(ret, tmp);
}
}
return ret;
}
};
代码实现(四刷自解 DAY 7 Golang)
func max(x, y int) int {
if x >= y {
return x
} else {
return y
}
}
func longestValidParentheses(s string) int {
chrstack, intstack := []byte{}, []int{}
ret := 0
for _, chr := range s {
if chr == '(' {
chrstack = append(chrstack, '(')
intstack = append(intstack, 0)
} else {
if len(chrstack) == 0 {
intstack = []int{}
continue
}
topnum := intstack[len(intstack) - 1]
intstack = intstack[:len(intstack) - 1]
if topnum != 0 {
topnum += intstack[len(intstack) - 1]
intstack = intstack[:len(intstack) - 1]
}
topnum += 2
chrstack = chrstack[:len(chrstack) - 1]
for len(intstack) != 0 && intstack[len(intstack) - 1] != 0 {
topnum += intstack[len(intstack) - 1]
intstack = intstack[:len(intstack) - 1]
}
intstack = append(intstack, topnum)
ret = max(ret, topnum)
}
}
return ret
}