1. 程式人生 > >Leetcode_32_Longest Valid Parentheses

Leetcode_32_Longest Valid Parentheses

思路一:

1.和判斷括號是否匹配相似,先遍歷一回字串,能匹配的先彈棧,不能匹配的先將下標壓棧。

此時,需要注意一個特殊情況:當字串為空時,可直接返回0.

2.再遍歷一回棧,根據留在棧中的下標判斷每一串匹配好的括號的長度,選擇最長的一個即可。

在此過程中,需要注意以下幾個特殊情況:

(1)棧為空:說明整個串均為有效的括號

(2)棧底元素不為1:說明在串的開頭存在有效括號,不要漏了

(3)棧頂元素不為n-1(n為串的長度):說明在串的結尾處存在有效括號,不要漏了

class Solution {
public:
    int longestValidParentheses(string s) {
        vector<int> parentheses_stack;
		int ans=0,i,n=s.size();
		if(n==0 || n==1)
			return 0;
		for(i=0;i<n;i++)
		{
			if(s[i]=='(')
				parentheses_stack.push_back(i);
			else
			{
				if(parentheses_stack.empty())
					parentheses_stack.push_back(i);
				else if(s[*(parentheses_stack.end()-1)]=='(')
					parentheses_stack.pop_back();
				else
					parentheses_stack.push_back(i);
			}
		}
		n=parentheses_stack.size();
		if(n==0)
			return s.size();
		if(parentheses_stack[0]!=0)
			ans=parentheses_stack[0];
		for(i=0;i<n-1;i++)
			if(ans<(parentheses_stack[i+1]-parentheses_stack[i]-1))
				ans=parentheses_stack[i+1]-parentheses_stack[i]-1;
		if(ans<s.size()-parentheses_stack[n-1]-1)
			ans=s.size()-parentheses_stack[n-1]-1;
		return ans;
    }
};

二、做法同上類似,但不需要遍歷兩遍,實現起來更簡潔

class Solution {
public:
    int longestValidParentheses(string s) {
        int ans=0,lastError=-1;
		vector<int> stack;
		for(int i=0;i<s.size();i++)
		{
			if(s[i]=='(')
				stack.push_back(i);
			else
			{
				if(stack.size()>0)
				{
					stack.pop_back();
					int len;
					if(stack.size()==0)
						len=i-lastError;
					else
						len=i-stack.back();
					if(len>ans)
						ans=len;
				}
				else
					lastError=i;
			}
		}
		return ans;
    }
};