题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串括号是否有效。
示例:
输入:"([)]" 输出:false
输入:"()[]{}" 输出:true
解析
考察重点:栈
实现方法
判断括号是否有效问题是经典的栈实现算法例子
循环遍历字符串每个字符:
- 非括号标示,判定无效
- 如果是前半部分括号"(","[","{",操作入栈
- 如果是后半部分括号")","]","}",如果栈为空无效;栈不为空,出栈结果判断是否匹配
代码
public boolean isValid(String s) {
if(s == null || s.length() == 0){//如果为空字符串则有效
return true;
}
/*定义匹配的括号*/
Map<Character, Character> mappings = new HashMap<Character,Character>(){{
put(')', '(');
put('}', '{');
put(']', '[');
}};
/*定义可能出现的前括号*/
List<Character> list = new LinkedList<Character>(){{
add('(');add('[');add('{');
}};
/*定义栈,循环遍历字符串每一个字符*/
Stack<Character> stack = new Stack<Character>();
for(int i = 0; i<s.length();++i){
Character c = s.charAt(i);
/*如果是前括号入栈*/
if(list.contains(c)){
stack.push(c);
continue;
}
Character p = mappings.get(c);
/*p为null表明c不是括号的字符*/
if(p == null){
return false;
}
/*读入后括号,如果栈为空,无效*/
if(stack.empty()){
return false;
}
/*读入后括号,出栈结果如果不匹配,无效*/
if(p != stack.pop()){
return false;
}
}
/*最后如果栈是空,有效;否则无效*/
if(stack.empty()){
return true;
}else{
return false;
}
}