1.题目描述
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
2.样例描述
3.思路描述
建立一个栈,遍历字符串,逐个判断字符,若是左括号,则打入栈;若是是右括号并且栈为空,则直接return false;如果它是一个闭合括号,它检查栈是否为空,并检查弹出的开放括号是否与当前闭合括号匹配。如果找到任何不匹配,方法返回。
4.代码展示
class Solution {
public boolean isValid(String s) {
int len = s.length();
if (len <= 1) return false;
//建立以各名为stack的栈
Stack<Character> stack = new Stack<>();
//开始遍历
for (int i = 0; i < len; i++) {
//逐个查找出每一个字符
char cur = s.charAt(i);
//判断该字符是否为左括号,若是则打入栈
if (isOpeningBracket(cur)) {
stack.push(cur);
} else {//否则判断栈是否为空,若为空返回false
if (stack.isEmpty()) {
return false;
}
//将栈顶元素赋值给top
char top = stack.pop();
//若不匹配,返回false
if (!isMatchingBracket(top, cur)) {
return false;
}
}
}
return stack.isEmpty();
}
private boolean isOpeningBracket(char c) {
return c == '(' || c == '{' || c == '[';
}
private boolean isMatchingBracket(char open, char close) {
return (open == '(' && close == ')') ||
(open == '{' && close == '}') ||
(open == '[' && close == ']');
}
}