题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例一:
示例二:
示例三:
示例四:
示例五:
题目分析
返回false共有三种情况:左括号多于右括号,右括号多于左括号,左右括号不匹配
左右括号对顺序是有要求的,不能简单地判断括号数量,因此需要用到栈
解题步骤:
- 遍历字符串,如果元素为左括号,入栈,如果元素为右括号,则分况讨论
- 如果栈为空,则说明左右括号不匹配或右括号多于左括号,return false;
- 如果栈不为空但括号不匹配,return false;
- 如果栈不为空且左右括号匹配,则继续遍历
- 遍历结束后如果栈不为空,则说明左括号多于右括号,return false;
- 如果栈为空,说明括号匹配,return true;
代码实现:
class Solution {
public boolean isValid(String s) {
//定义一个栈,遍历字符串s,如果查找到左括号,入栈,如果遍历到右括号,查看栈顶元素看是否匹配
//如果栈为空,说明不匹配,返回false
//如果栈不为空但括号不匹配,返回false
//如果匹配,继续遍历
//遍历结束后,如果栈不为空,说明左括号多,返回false
//如果仍未返回,则说明括号匹配,返回true
Stack<Character> stack = new Stack<>();
for(int i=0;i<s.length();++i){
char c = s.charAt(i);
if(c=='(' || c=='[' || c=='{'){ //遍历时遇到左括号,入栈
stack.push(c);
}else{ //遍历遇到右括号,判断
if(stack.empty()){ //栈为空
return false;
}
char top = stack.peek();
//左右括号匹配,则将栈顶元素弹出,继续遍历
if(top=='('&& c==')' || top=='{'&& c=='}' || top=='['&& c==']' ){
stack.pop();
}else{ //左右括号不匹配
return false;
}
}
}
if(!stack.empty()){ //遍历结束后栈不为空,证明左括号多于右括号
return false;
}
return true;
}
}
运行通过