一、题目叙述:
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.
Subscribe to see which companies asked this question
二、解题思路:
本题即求最长有效括号序列长度,我自己想了好久, 没想出来,最后参考了别人的想法。
1、使用栈,遇到左括号,把左括号的下标入栈。
2、遇到右括号时,
(1)若此时栈内为空,则将序列开始标识start变为i + 1(说明之前有效括号序列终止重新开始)
(2)若此时栈不空,则出栈,若此时栈为空,计算有效序列长度为 i - start + 1,更新记录max;若此时栈不空,则计算有效序列长度为i - 栈顶元素值,更新记录max。
(3)最后max值即为最长有效括号序列长度。
三、源码:
import java.util.LinkedList;
public class Solution
{
public int longestValidParentheses(String s)
{
LinkedList<Integer> stack = new LinkedList<Integer>();
int start = 0, max = 0;
for (int i = 0; i < s.length(); i++)
{
if (s.charAt(i) == '(') stack.addFirst(i);//左括号入栈
else if (s.charAt(i) == ')')//若为右括号
{
if (stack.size() == 0)
start = i + 1;
else
{
stack.removeFirst();
if (stack.size() == 0)
{
if (i - start + 1 > max)
max = i - start + 1;
}
else
{
if (i - stack.getFirst() > max)
max = i - stack.getFirst();
}
}
}
}
return max;
}
public static void main(String[] args)
{
Solution sol = new Solution();
String s = ")()())";
System.out.println(sol.longestValidParentheses(s));
}
}