博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
32. 最长有效括号
阅读量:4029 次
发布时间:2019-05-24

本文共 1287 字,大约阅读时间需要 4 分钟。

给一个只包含 '(' 和 ')' 的字符串,找出最长的有效(正确关闭)括号子串的长度。

对于 "(()",最长有效括号子串为 "()" ,它的长度是 2。

另一个例子 ")()())",最长有效括号子串为 "()()",它的长度是 4。

 

思路:设置一个变量l,表示当前未被匹配的左括号数目。设置一个vector<int>re来记录字符匹配情况,我们用-1代表左括号,1代表右括号。

每当遇到左括号的时候:就将-1压入re中,并且l++。

每当遇到右括号的时候,看一下l的大小:

1、如果l>0,说明前面有和它相匹配的左括号,然后我们就去re中找离它最近的-1,就是和它相匹配的那个左括号。这个时候有两种情况,一个是re.back()就是-1,我们就把re.back()元素pop出来,然后压进去2,表示有两个字符是匹配的。另外一种情况是它前面有一些2,4,6这样的整数(有一些匹配字符),再前面才是-1。这种情况下,我们就要不断的把这些元素pop出来,加起来,直到找到-1,再将刚才的和加上2,然后再压入re中。同时l-1,说明未匹配的左括号数目少了1.

2、如果l=0,说明它前面没有和它相匹配的左括号,将1压入re中。

最后我们对这个re进行一次遍历,寻找最长有效括号数目,这里面的数字应该是被1,或者是-1分隔开的一些区间。每一个区间连续和的最大值即为所求。

class Solution {public:    int longestValidParentheses(string s) {        vector
re; int l = 0, ans = 0; for (auto x : s){ if (x == '(') { ++l; re.push_back(-1); } if (x == ')') { if (l>0){ int temp=0; while (re.back() != -1){ temp += re.back(); re.pop_back(); } re.pop_back(); l--; re.push_back(temp += 2); } else{ re.push_back(1); } } } for (int i = 0; i

 

转载地址:http://uhabi.baihongyu.com/

你可能感兴趣的文章
集成学习(Bagging、Boosting、Stacking)
查看>>
无监督学习
查看>>
K均值算法(K-means)
查看>>
机器学习中的损失函数
查看>>
机器学习中的性能度量
查看>>
机器学习中的优化问题
查看>>
机器学习中的参数估计方法
查看>>
机器学习中的特征工程
查看>>
Softmax数值不稳定问题
查看>>
Spark学习笔记(一)——Spark编程
查看>>
奇异值分解(Singular Value Decomposition, SVD)
查看>>
文本处理—LSA、 LDA
查看>>
文本匹配(Text Matching)
查看>>
机器学习中的正则化方法
查看>>
广告学与在线广告
查看>>
计算广告
查看>>
Web广告--广告定向
查看>>
卷积神经网络中的算术问题(Convolution arithmetic)
查看>>
卷积神经网络在计算机视觉中的演进
查看>>
推荐系统初探
查看>>