题目:
思路:
括号字符串依次入栈,删除匹配的成对括号。最后栈中留下的都是无法匹配的断点。这些断点的差值减一就是断点间有效括号串的长度,取这些长度的最大值即可。
例如括号字符串 “)()((())(”,最后留在栈中的字符下标为 0 3 8。根据这三个断点可以得到,两个有效括号子串的长度分别为 3-0-1 = 2 和 8-3-1=4。所以最长的长度就是 4。
https://www.jianshu.com/p/e6b6e3b964d8
代码:
public int longestValidParentheses(String s) {
if(s.length() <= 1) return 0;
List<Integer> stack = new ArrayList<>();
for(int i = 0; i < s.length(); ++i){
if(!stack.isEmpty()
&& s.charAt(i) == ')'
&& s.charAt(stack.get(stack.size()-1)) == '(') stack.remove(stack.size()-1);
else stack.add(i);
}
stack.add(s.length());
int longest = stack.get(0);
int diff;
for(int i = 1; i < stack.size(); ++i){
if((diff = stack.get(i)-stack.get(i-1)-1) > longest) longest = diff;
}
return longest;
}