算法分析: 最长有效括号的长度

提名来自庞果网:http://hero.pongo.cn/home/index

题目详情

给定只包含括号字符'(‘和 ‘)”的字符串,请找出最长的有效括号内子括号的长度。

举几个例子如下:

  1. 例如对于”( ()”,最长的有效的括号中的子字符串是”()” ,有效双括号数1个,故它的长度为 2。 
  2. 再比如对于字符串”) () () )”,其中最长的有效的括号中的子字符串是”() ()”,有效双括号数2个,故它的长度为4。 
  3. 再比如对于”( () () )”,它的长度为6。     

    换言之,便是有效双括号”()”数的两倍。

给定函数原型int longestValidParentheses(string s),请完成此函数,实现上述功能。

这个题目比较简单,一次遍历即可解决,我们用一个栈来保存中间数据,

一个int max保存最大长度, int cur保存当前长度,碰到 ‘(‘即放入栈中,

碰到’)’,则从栈中pop一个数据出来,栈不为空则将cur+2,为空则碰到无效字符,

需要重新计算。

因为只需要判断栈中元素个数,所以下面代码用一个int来代替

int longestValidParentheses(string s)  
{
	int max = 0, cur = 0;
	int stack = 0;

	int i = 0;
    while (i < s.length())  
    {
        if (s.at(i) == '(')  
        {    
			stack++;            		
        }  
        else if(s.at(i) == ')')
        {
			if (stack == 0 && cur > max)
			{				
				max = cur;
				cur = 0;			
			}
			else
			{				
				cur += 2;				
				stack--;
			}
        }  

        i++;  
    }
    
	if (cur > max) max = cur;
    return max;  
}

太长时间没有纸上写代码了, 这个提交的时候又把 cur = 0;这句给漏了。。。郁闷

点赞