题目描述(题目链接)
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例
输入:s = "([)]"
输出:false输入:s = "{[]}"
输出:true
求解思路
引入一个栈tmp,遍历字符串,若是左括号,入栈;若是右括号,出栈,若出栈的左括号刚好能和当前的右括号匹配,就继续,若不能,直接返回false。最后,如果全部匹配完了,栈为空,返回true;否则,返回false。
注意:若是右括号,要先判断栈是否为空,若为空,直接返回false。
附:栈的isEmpty()比empty()运行效率要高。
代码
执行用时:2 ms, 在所有 Java 提交中击败了76.11%的用户
内存消耗:36.4 MB, 在所有 Java 提交中击败了94.66%的用户
class Solution {
public boolean isValid(String s) {
Stack<Character> tmp = new Stack<Character>();
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='('||s.charAt(i)=='{'||s.charAt(i)=='['){ //左括号
tmp.push(s.charAt(i));
continue;
}
if(tmp.isEmpty()){ //右括号
return false;
}else{
if(s.charAt(i)==')'){
if(tmp.pop()!='('){
return false;
}
}else if(s.charAt(i)=='}'){
if(tmp.pop()!='{'){
return false;
}
}else if(s.charAt(i)==']'){
if(tmp.pop()!='['){
return false;
}
}
}
}
return tmp.isEmpty();
}
}
评论区看到的改进代码
思想:当遍历到左括号时,push其对应的右括号入栈;这样遍历到右括号时就三种情况:
- 栈为空(说明前面没有左括号),返回false
- 不能匹配到当前栈顶元素,返回false(前面的做法使得这里不用分情况讨论)
- 能匹配,直接pop就行了
执行用时:1 ms, 在所有 Java 提交中击败了99.17%的用户
内存消耗:36.6 MB, 在所有 Java 提交中击败了66.56%的用户
class Solution {
public boolean isValid(String s) {
Stack<Character>stack = new Stack<Character>();
for(char c: s.toCharArray()){
if(c=='(')stack.push(')'); //左括号
else if(c=='[')stack.push(']');
else if(c=='{')stack.push('}');
else if(stack.isEmpty()||c!=stack.pop())return false; //右括号
}
return stack.isEmpty();
}
}