给定一个只包括 '('
, ')'
, '{'
, '}'
, '['
, ']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
解题思路:利用栈的先进后出原则、属于左括号'('
, '{'
, '['
的进行入栈、当出现右括号 ')'
, '}'
, ']'
时、看栈顶是否是与之对应的左括号、如果是将栈内对应的左括号弹出、如果不能对应上则表示括号不是对应的。
代码示例:
public boolean isValid(String s) {
Deque<Character> stack = new ArrayDeque<>();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(' || s.charAt(i) == '{' || s.charAt(i) == '[') {
// 字符串中是左括号进行入栈操作
stack.push(s.charAt(i));
} else {
if (stack.isEmpty()) {
return false;
} else {
// 当前字符串是右括号、若栈顶不是与之对应的左括号则表示此字符串无效
if (stack.peek() == '(' && s.charAt(i) != ')') {
return false;
} else if (stack.peek() == '{' && s.charAt(i) != '}') {
return false;
} else if (stack.peek() == '[' && s.charAt(i) != ']') {
return false;
}
// 符合条件的一组 弹出栈顶
stack.pop();
}
}
}
// stack.isEmpty() true:字符串括号有效都是对应的 false: 无效 不对应
return stack.isEmpty();
}