Leetcode#32 Longest Valid Parentheses

原题地址

方法I:动态规划

len[i]表示从i开始到结束的最长合法括号串长度,则:

如果s[i] == "(" 且 s[i+len[i+1]+1]==")",len[i] = len[i+1] + 2

否则len[i] = 0

方法II:辅助栈

跟那个直方图求最大面积有点类似,用一个栈保存合法括号串的长度,显然长度只能是大于0的偶数(废话),所以可以用0表示"("。

如果当前元素是"(",将0压栈

如果当前元素是")",依次查看栈顶元素并弹栈

如果栈顶元素大于0,说明这是一个合法括号串的长度,那么累加到总长度上

如果栈顶元素等于0,说明遇到了一个"(",将总长度+2,然后重新压栈,如果有必要,更新最长括号长度

这样遍历完s以后,栈里面都是一些局部括号串的长度,以及一些0(代表未匹配的"("),然后再做一遍上面的操作即可

代码:(方法II)

 1 int longestValidParentheses(string s) {
 2   stack<int> st;
 3   int len = 0;
 4   int top = 0;
 5   int maxLen = 0;
 6 
 7   for (int i = 0; i < s.length(); i++) {
 8     if (s[i] == '(')
 9       st.push(0);
10     else {
11       len = 0;
12       while (!st.empty()) {
13         int top = st.top();
14         st.pop();
15         len += top;
16         if (top == 0) {
17           len += 2;
18           st.push(len);
19           break;
20         }
21       }
22       maxLen = max(maxLen, len);
23     }
24   }
25 
26   len = 0;
27   while (!st.empty()) {
28     top = st.top();
29     st.pop();
30     if (top > 0)
31       len += top;
32     else {
33       maxLen = max(maxLen, len);
34       len = 0;
35     }
36   }
37   maxLen = max(maxLen, len);
38 
39   return maxLen;
40 }
原文地址:https://www.cnblogs.com/boring09/p/4243153.html