LeetCode: Longest Valid Parentheses

思路:搜索字符串,碰到 '(' 就压入栈中,并记录其位置,碰到 ')'  就从栈顶取出一个符号'(',并且更新当前的最大合理括号对数目。令f(i)为当前的数目,则f(i) = f(i - pre) + i - pre;

其中pre表示从栈顶取出的'('符号位置的前一个位置,即当前如果搜索到')'(位置为pre + 1),找出与它配对的'(',它们之间的合理数目为 i - pre,加上前面位置pre已有的合理数目,就是整个合理数目。注意,如果碰到第i个位置的符号是‘(’,则让f(i) = 0,因为 '(' 总是不能形成合理括号对。

struct Symbol{
	char sym;
	int position;
	Symbol(char a,int b):sym(a), position(b){}
};
class Solution {
public:
    int longestValidParentheses(string s) {
		if(s.empty())return 0;
		stack<Symbol> st;
		int len = s.length();
		int *f = new int[len];
		int ret = 0;
		int num = 0;
		f[0] = 0;
		for(int i=0;i<s.length();i++){
			Symbol temp(s[i],i);
			if(s[i] == '('){
				st.push(temp);
				f[i] = 0;
			}
			else{
				if(!st.empty()){
					Symbol m = st.top();
					if(m.position-1>0) f[i] = f[m.position-1] + i - m.position + 1;
					else
						f[i] = i - m.position + 1;
					//cout<<m.position-1<<" "<<f[i]<<endl;
					st.pop();
				}
				else
					f[i] = 0;
			}
			ret = max(ret,f[i]);
		}
		return ret;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值