您的位置:首页 > 其它

最长的有效括号内子括号的长度(来自 庞果)修改后的算法

2014-01-12 23:11 225 查看
这个算法是把之前写的算法进行了修改,个人认为这个算法正确理解了题目的含义。例如:) ( ( ) ) ) ( ( ) ( ) ( ) ( ) ),在第六个元素“)”处被打断,需要从后边开始重新计算有效括号的长度。这个例子中有两个有效括号长度,需要记录长度最大的那个。

代码如下:

public static int longestValidParentheses(String s){
int count=0;	//用于记录有效括号的对数
//因为一个字符串中可能有多个。例如) ( ( ) ) ) ( ( ) ( ) ( ) ( ) )
//在第六个元素“)”处被打断,需要从后边开始重新计算有效括号的长度
int max = 0;	//用来记录长度最大的那一个
final String strLeft = "(";
final String strRight = ")";
char[] parentheses = s.toCharArray();	//将字符串转换成字符数组
Stack<String> stack = new Stack<String>();

int length = s.length();	//字符串的长度
for(int i=0; i<length; i++){
if(stack.isEmpty()){	//首次循环,栈空 把元素放入栈
if(parentheses[i] == '(')
stack.push(strLeft);
//若首次遇到")" 无需放入栈中
}else
{
String temp = stack.peek();	//获取栈顶元素
//从栈里弹出的元素肯定是"(",因为只有"("入栈了
if(parentheses[i]==')' && temp==strLeft){
stack.pop();	//配对成功,弹出栈中的元素
count++;
if(stack.isEmpty()){ //如果栈stack为空,说明其中的一部分有效长度的括号查找完毕,需要记录其长度
//当栈为空的时候,说明字符串中的其中一个有效括号查找完毕
//需要和之前的max值进行比较,始终让max中存储的是最大的值
max = max > count ? max : count;
count = 0;	//需要把count置0,用作下一次计数
}
}else{
if(parentheses[i] == '(')
stack.push(strLeft);
//“)”无需放入栈中
}
}
}
return 2*max;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: