有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
public boolean isValid(String s) {
if (s==null || s.length()==0) return true;
char[] ch = s.toCharArray();
Stack<Character> stack = new Stack();
for(int i=0;i < ch.length;i++) {
if (ch[i]==')' && stack.size()>0 && stack.peek()=='(')
stack.pop();
else if (ch[i]==']' && stack.size()>0 && stack.peek()=='[')
stack.pop();
else if (ch[i]=='}' && stack.size()>0 && stack.peek()=='{')
stack.pop();
else {
stack.push(ch[i]);
}
}
if (stack.size() != 0)
return false;
return true;
}
最长有效括号
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
public int longestValidParentheses(String s) {
if (s==null || s.length()==0) return 0;
char[] ch = s.toCharArray();
Stack<Integer> stack = new Stack();
//先推入-1可以避免当栈为空时要减栈顶的index,为空时也可以正常计算
stack.push(-1);
int result = 0;
for(int i=0;i < ch.length;i++) {
//只有当')'不是第一个遍历的(stack.size()>1),并且遍历到的符号为')'而栈顶是'('时两个可以配对
if (ch[i] == ')' && stack.size()>1 && ch[stack.peek()] == '(') {
stack.pop();
// (())() 前面两对result=4,后面一对result=2,凡是涉及到最长,一定是max
result = Math.max(result, i - stack.peek());
}else stack.push(i);
}
return result;
}