[leetcode]Longest Valid Parentheses

Longest Valid Parentheses

题目:

Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.

For "(()", the longest valid parentheses substring is "()", which has length = 2.

Another example is ")()())", where the longest valid parentheses substring is "()()", which has length = 4.

解题思路:最容易想到的解法就是穷举法,计算任意两点(i到j)之间有多少个合法的()串,借助动态规划可以得到结果。算法复杂度为:O(n3)。

  用栈来解决明显可以减小时间复杂度,但是这里入栈的是元素的索引,这样用于求最长匹配的括号长度。在程序中设置一个匹配起点ptstart用于保存当前匹配的起点,用mxlength来保存当前的匹配最大长度。

  每次来了‘(’之后,无条件压栈。如果碰到')'的话,如果栈不为空,就消除栈内栈顶的'('
  1.消除掉'('之后,如果栈内还有剩余的‘(’的话,最长的合法长度就是:maxlength = max(i - stack.top() , maxlength);  也就是取:当前')'的index减去栈顶元素的index  和 原来max_length 两者的最大值。

    例如:对于这种情况:()(()(),可以正确的得出最大值为4。

  2.消除掉')'之后,栈内没有剩余的‘(’了。此时需要引入一个新的变量ptstart,用于表示合法括号字符串的起点。

    例如:对于这种情况:())()(),可以正确的得出最大值为4。
  start初始为-1,之后每次碰到‘)’且栈为空的时候更新为当前‘)’的index。也就是说无法消除的)之后的括号不可能再和前面的括号合并在一起计算最长序列,所以更新start。

c++代码:

#include <iostream>
#include <string>
#include <stack>
using namespace std;
class Solution {
public:
    int longestValidParentheses(string s) {
		int maxlength = 0;
		int len = s.length();
		int i;
		int ptstart = -1;
		stack<int> st;
		for(i = 0; i < len; i++){
			if(s[i] == '('){
				st.push(i);
			}
			if(s[i] == ')'){
				if(st.empty()){
					ptstart = i;
				}else{
					st.pop();
					if(st.empty()){
						maxlength = max(i-ptstart, maxlength);
					}else{
						maxlength = max(i-st.top(),maxlength);
					}
				}
			}
		}
        return maxlength;
    }
};

int main(){
	Solution s = Solution();
	string test = "(()(()";
	int r = s.longestValidParentheses(test);
	cout << r << endl;
	return 0;
}

  

  

原文地址:https://www.cnblogs.com/zhutianpeng/p/4254652.html