「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战」。
描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
```
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
## 做题
这道题要使用到栈了,看到示例4,它还要求括号要对称,那这样做起来就比较简单了,直接遇到')]}'这三个字符,再从栈里拿出来看看是不是对称的,不是就全部放回去。
char 可以使用 Character 引用。
```JAVA
public boolean isValid(String s) {
if(s == null || s.length() == 0 || "".equals(s)){
return true;
}
Stack<Character> stack = new Stack();
stack.push(s.charAt(0));
Character p = null;
for(int i = 1;i<s.length();i++){
Character item = s.charAt(i);
switch(item){
case ']':
if(stack.empty()){
return false;
}
p = stack.peek();
if(!p.equals('[')){
return false;
}
stack.pop();
break;
case '}':
if(stack.empty()){
return false;
}
p = stack.peek();
if(!p.equals('{')){
return false;
}
stack.pop();
break;
case ')':
if(stack.empty()){
return false;
}
p = stack.peek();
if(!p.equals('(')){
return false;
}
stack.pop();
break;
default:
stack.push(item);
}
}
//当 stack 中没有数据,说明左括号都出来了,不然就是不对成
return stack.empty();
}
这里的代码太冗余了,我们可以使用哈希表简化一下。
public boolean isValid(String s) {
if(s == null || s.length() == 0 || "".equals(s)){
return true;
}
Map<Character,Character> map = new HashMap(4);
//这里右括号为 key,左括号为 value,因为当遇到右括号时才需要处理
map.put('}','{');
map.put(')','(');
map.put(']','[');
Stack<Character> stack = new Stack();
stack.push(s.charAt(0));
Character p = null;
for(int i = 1;i<s.length();i++){
Character item = s.charAt(i);
if(map.containsKey(item) ){
if(stack.empty() || map.get(item)!=stack.peek()){
//当栈为空,说明多出一个右括号;当对应的左括号和栈的顶部不相等,说明不对称
return false;
}
stack.pop();
}else {
stack.push(item);
}
}
return stack.empty();
}
执行时间都差不多。
最后
今天就到这里了。
这里是程序员徐小白,【每日算法】是我新开的一个专栏,在这里主要记录我学习算法的日常,也希望我能够坚持每日学习算法,不知道这样的文章风格您是否喜欢,不要吝啬您免费的赞,您的点赞、收藏以及评论都是我下班后坚持更文的动力。