题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
代码模板:
class Solution {
public boolean isValid(String s) {
}
}
分析
这个题目看到能想到的就是用Stack,Stack的特点是先进后出,也就是可以想想把做好的煎饼堆在一起,最好做好的放在最后面,刚刚做好的放在最上面。
循环字符串,如果遇到了"(","[","{",就存入Stack,如果遇到了")","]","}"就取出最上面的Stack,如果取到的反向不相等就return false,如果相等就继续。
解答
class Solution {
public boolean isValid(String s) {
if(null == s || s.length() == 0){
return true;
}
Stack<Character> stack = new Stack<>();
for(int i = 0;i<s.length();i++){
if(s.charAt(i) == '('||s.charAt(i) == '['||s.charAt(i) == '{'){
stack.push(s.charAt(i));
}else if((s.charAt(i) == ')'||s.charAt(i) == ']'||s.charAt(i) == '}')&&!stack.empty()){
char lastChari = stack.pop();
if(getReverseParentheses(s.charAt(i) )!= lastChari){
return false;
}
}else{
return false;
}
}
if(!stack.empty()){
return false;
}
return true;
}
//这里其实可以写个map来get
public char getReverseParentheses(char ch){
char returnChar = 0;
switch(ch){
case ')':
returnChar = '(';
break;
case '}':
returnChar = '{';
break;
case ']':
returnChar = '[';
break;
}
return returnChar;
}
}