20、括号匹配
描述:给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
解法1:首先想到遍历给定的括号字符串,遇到左括号尾加到StringBuilder中,遇到右括号就比对StringBuilder中最后一个括号是否和当前的右括号匹配,是的话就删除SB中的最后的字符。
解法2:利用Stack的思想。new一个<Character>的Stack ,遍历括号字符串,遍历到左括号是将对应的右括号入栈,遍历到右括号是就判断出栈的字符和当前的字符是否一样,不一样返回false;
class Solution {
public boolean isValid(String s) {
/** 解法1
StringBuilder sb = new StringBuilder();
int i =0;
while(i<s.length()-1){
if(s.charAt(i)=='(' || s.charAt(i)=='[' || s.charAt(i)=='{')
sb.append(s.charAt(i));
if(s.charAt(i)==')' || s.charAt(i)==']' || s.charAt(i)=='}'){
if(sb.charAt(sb.length()-1) == s.charAt(i)){
sb.deleteCharAt(sb.length()-1);
}else{
return false;
}
}
i++;
}
return true;
**/
if(s.isEmpty()){
return true;
}
Stack<Character> st = new Stack<Character>();
for(int i = 0;i<s.length();i++){
char push_char = s.charAt(i);
switch(push_char){
case '(':
st.push(')');
break;
case '[':
st.push(']');
break;
case '{':
st.push('}');
break;
default:
try{
if(push_char!=st.pop()){
return false;
}
}catch(Exception e){
return false;
}
}
}
return st.empty();
}
}