一,问题描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
!!!注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例2.
输入: “(]”
输出: false
示例3:
输入: “([)]”
输出: false
示例4:
输入: “{[]}”
输出: true
二,解决思路
1.调用Map接口实现创建Map实例放入(括号)键值对作为后序判定
2,创建一个栈
3,遍历字符串,逐个取出字符
3.1遍历过程中如果为左括号就入栈
3.2如果为右括号,就取出栈顶元素查表对比是否与右括号相同
4.遍历结束,栈为空,且之前没有返回false,就认为所有括号匹配
(具体流程也可参考代码注释)
三,代码实现
public static boolean isValid(String str){
Map<Character,Character> map = new HashMap<>();
map.put('(',')');
map.put('{','}');
map.put('[',']');
//先创建一个栈
Stack<Character> stack = new Stack<>();
//循环遍历每个字符
for(int i = 0; i < str.length(); i++ ){
char rec = str.charAt(i);
//取出当前字符,如果为右括号就入栈
if(rec == '(' || rec == '[' || rec == '{'){
stack.push(rec);
continue; //返回继续判断是否需要入栈
}
//判断rec为右括号即取出栈顶元素
if(stack.empty()){
//如果发现当前字符不是左括号,并且栈为空,说明当前字符违法
//这种情况说明没有合适的左括号与当前括号匹配
return false;
}
char top = stack.pop();
//判断c是否为右括号,如果是就取出栈顶元素top与rec比较
if(map.get(top) == rec ){
continue;
}
return false;
}
if(stack.empty()){ //最后栈为空即所有括号都匹配成功
return true;
}
return false;
}