标签:
题目链接:https://leetcode.com/problems/longest-valid-parentheses/
题目:
Given a string containing just the characters ‘(’ and ‘)’, find the length of the longest valid (well-formed) parentheses substring.
For “(()”, the longest valid parentheses substring is “()”, which has length = 2.
Another example is “)()())”, where the longest valid parentheses substring is “()()”, which has length = 4.
思路:
这题简直太恶心了,,根据http://blog.csdn.net/yeqiuzs/article/details/51622394 很容易想到利用栈来做,所以我压根没想用dp,思路也简单,为了简单起见,用一个数组保存字符串中字符是否是有效字符,用栈判断,最后遍历一遍数组,找到最长的连续的有效字符。。。
为啥说这题ac的时间要求恶心呢,上面这种思路,c++可以ac,java就超时,我在本地测试了一下超时的例子,结果发现能ac的方法和超时的方法运行时间差别很小,只有不到10ms。。= =!
无语,怀疑是两遍遍历时间刚好超了,只好尝试一遍遍历得到结果。
这里用栈只保存左括号的下标,当遇到一个右括号若栈存在左括号,就计算一下有效字符串的长度。
算法:
public int longestValidParentheses(String s) {
Stack<Integer> stack = new Stack<Integer>();
int lastInvalid = -1, max = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == ‘(‘) {
stack.push(i);
} else if (c == ‘)‘) {
if (stack.isEmpty()) {
lastInvalid = i;
} else {//形成一组有效括号对
stack.pop();
if(stack.isEmpty()){
max = Math.max(max, i-lastInvalid);
}else{//若仍有左括号等待配对 则此时它是最近左边的一个失效括号
max = Math.max(max, i-stack.peek());
}
}
}
}
return max;
}
【Leetcode】Longest Valid Parentheses
标签:
原文地址:http://blog.csdn.net/yeqiuzs/article/details/51627675