题目
32. Longest Valid Parentheses
- Difficulty: Hard
 
- Total Accepted: 152.4K
 
- Total Submissions: 632.8K
 
Given a string containing just the characters ‘(‘ and ‘)’, find the length of the longest valid (well-formed) parentheses substring.
Example 1:
Input: "(()"
Output: 2
Explanation: The longest valid parentheses substring is "()"
Example 2:
Input: ")()())"
Output: 4
Explanation: The longest valid parentheses substring is "()()"
题目链接
解题报告
AC 截图
题目大意
本题要求我们寻找一个括号字符串中最长的合法符号子串长度
解题思路
验证一个字符串是否是合法的括号字符串是简单的。我们只需要将其所有的左括号入栈,然后当右括号到来时弹出一个栈内括号,如果遇到栈为空,则判定为非法。若最后结束时没有括号剩余在栈中,则说明符号串合法。
由此出发,我们可以把所有匹配的串都加上一个标识,然后再扫一遍,找出最长连续的标识即可。整个算法的时间复杂度为 O(n)。
题解
AC 截图
C++ 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
   | static const auto runfirst = []() {     std::ios::sync_with_stdio(false);     std::cin.tie(nullptr);     std::cout.tie(nullptr);     return nullptr; }();
  class Solution {  public:   int longestValidParentheses(string& str) {     int size = str.size();     int max = 0, counter = 0;     vector<bool> validArr(size, false);     stack<int> parentheses;          for (int index = 0; index < size; ++index) {       if (str[index] == '(') parentheses.push(index);       else if (!parentheses.empty()) {         validArr[parentheses.top()] = true;         validArr[index] = true;         parentheses.pop();       }     }
      for (const auto &iter : validArr) {       if (iter) {         ++counter;       }       else {         if (max < counter) {           max = counter;         }         counter = 0;       }     }
      return ((max > counter) ? max : counter);   } };
  |