题目描述
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例
示例 1:
输入:s = “()[]{}”
输出:true
示例 2:
输入:s = “(]”
输出:false
示例 3:
输入:s = “([)]”
输出:false
示例 4:
输入:s = “{[]}”
输出:true
Notice
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成
思路
首先我们只考虑一种情况,即只存在()这一种情况分析
//首先我们只考虑一种情形,只包含“(”这种情况,代码如下:
public boolean isValid(String s) {
int n = s.length();
if(n % 2 == 1){//如果字符串长度为奇数,那我们直接判断返回false
return false;
}
ArrayDeque<Character> stack = new ArrayDeque<>();//定义一个栈,满足先进来的后处理的特性
for(char c : s.toCharArray()){//for循环来遍历字符数组,用字符c来接收
if(c == '('){//如果遍历的字符为左括号,就让该字符进栈
stack.push(c);
}else{//此时表明遇到了右括号,因为这里我们只考虑一种小括号的情况,当遇到右括号的时候,出栈即可
if(stack.isEmpty()){//这里的判断表明当栈里左右括号闭合后,还有右括号,此时我们也要返回false
return false;
}
stack.pop();//这里的情况是栈里左括号还没闭合完,遇到右括号直接出栈即可
}
}
//这里返回的为true还是false就只需要看栈里的元素是否为空,当遍历完字数串后,栈里还剩下元素(不为空),就返回false,
当遍历完字符串后,栈里没有元素了(栈为空),就返回true
return stack.isEmpty();
}
当主体代码完成后,我们再考虑题目要求的三种情形
public boolean isValid(String s) {
if(s.length() % 2 == 1){
return false;
}
ArrayDeque<Character> stack = new ArrayDeque<>();
for(char c : s.toCharArray()){
if(c == '(' || c =='{' || c == '['){//当遍历的字符都是左括号时,都将该字符进栈
stack.push(c);
}else{//这里是遇到右括号的情形
if(stack.isEmpty()){//首先判断这里的栈是否为空,若为空,此时还有右括号,则要返回false
return false;
}
char top = stack.pop();//这里不能单纯的出栈,因为需要进行判断右括号是否同左括号是同一类型的,这里我们
//取出栈顶的元素进行如下判断
if(c == ')' && top != '('){
return false;
}
if(c == ']' && top != '['){
return false;
}
if(c == '}' && top != '{'){
return false;
}
}
}
//这里返回的为true还是false就只需要看栈里的元素是否为空,当遍历完字数串后,栈里还剩下元素(不为空),就返回false,
// 当遍历完字符串后,栈里没有元素了(栈为空),就返回true
return stack.isEmpty();
}
提交代码运行如下:
代码扩展性优化,使用map来避免重复的if判断
//代码扩展性优化
public boolean isValid(String s) {
if(s.length() % 2 == 1){
return false;
}
Map<Character,Character> map = new HashMap<>();
map.put('(',')');
map.put('[',']');
map.put('{','}');
ArrayDeque<Character> stack = new ArrayDeque<>();
for(char c : s.toCharArray()){
if(map.containsKey(c)){//当遍历的字符都是左括号时,都将该字符进栈
stack.push(c);
}else{//这里是遇到右括号的情形
if(stack.isEmpty()){//首先判断这里的栈是否为空,若为空,此时还有右括号,则要返回false
return false;
}
char top = stack.pop();//这里不能单纯的出栈,因为需要进行判断右括号是否同左括号是同一类型的,这里我们
//取出栈顶的元素进行如下判断
if(c != map.get(top)){
return false;
}
}
}
//这里返回的为true还是false就只需要看栈里的元素是否为空,当遍历完字数串后,栈里还剩下元素(不为空),就返回false,
// 当遍历完字符串后,栈里没有元素了(栈为空),就返回true
return stack.isEmpty();
}
运行截图如下