题目
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
解答:
class Solution {
/**
* 判断是否包含有效的括号。
* @param s
* @return
*/
public boolean isValid(String s) {
//空字符串算有效。
if (s.equals("")) {
return true;
}
//用两个集合分别来装左右括号。
List<Character> left = new ArrayList<>();
List<Character> right = new ArrayList<>();
left.add('(');
left.add('[');
left.add('{');
right.add(')');
right.add(']');
right.add('}');
//把字符串转换为字符数组。
char[] chars = s.toCharArray();
//用栈来操作字符数组,遇到左括号进栈,遇到右括号把对应的左括号出栈;
Stack<Character> stack = new Stack();
for (char a : chars) {
//把左括号进栈。
if (left.contains(a)) {
stack.push(a);
continue;
}
//其它非括号的字符不操作。
if (!right.contains(a)) {
continue;
}
//此时代表当前字符是右括号。
//栈为空代表有多余的右括号。
if (stack.isEmpty()) {
return false;
}
char c = stack.pop();
int index = right.indexOf(a);
//如果栈顶不是对应的左括号,则代表括号顺序异常。
if (c != left.get(index)) {
return false;
}
}
//如果栈不为空,那么代表有多余的左括号。
return stack.isEmpty();
}
}