给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
public static void main(String[] args) {
String s = "{[)}";
//s = "{}[]()";
boolean b = isValid(s);
System.out.println(b);
}
public static boolean isValid(String s) {
int length = s.length();
//如果长度为偶数 不满足
if (length % 2 == 1) {
return false;
}
Map<Character, Character> pairs = new HashMap<Character, Character>() {{
put(')', '(');
put(']', '[');
put('}', '{');
}};
//新建一个 堆栈
Deque<Character> stack = new LinkedList<>();
//遍历字符串
for (int i = 0; i < length; i++) {
char c = s.charAt(i);
if (pairs.containsKey(c)) {
// 栈为空 或者 栈顶元素不等于 字符元素 则不符合规则 返回flase
if (stack.isEmpty() || stack.peek() != pairs.get(c)) {
return false;
}
stack.pop();
} else {
// 栈中不存在, 则入栈
stack.push(c);
}
}
// 上面操作完事,如果有不符合 都直接返回false
//走到下面这一步,证明符合规则 所有括号配对成功都出栈
return stack.isEmpty();
// Stack<Character> stack = new Stack<>();
// for (char c : s.toCharArray()) {
// //遇到左括号,将相应的右括号入栈
// if (c == '(') stack.push(')');
// else if (c == '[') stack.push(']');
// else if (c == '{') stack.push('}');
// //遇到右括号且匹配
// else if (!stack.isEmpty() && stack.peek() == c) stack.pop();
// //出现右括号多余或者右括号不匹配
// else return false;
// }
// //如果字符串遍历结束,栈中仍有字符,说明有左括号多余
// //否则反之
// return stack.isEmpty();
}