一,问题描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。 有效字符串需满足: 1.左括号必须用相同类型的右括号闭合。 2.左括号必须以正确的顺序闭合。 !!!注意空字符串可被认为是有效字符串。 示例 1:
输入: “()” 输出: true
示例2.
输入: “(]” 输出: false
示例3:
语言 |
方法 |
4020 |
568P7x4Cy4 |
DLrho |
赚钱方式大全 |
5274 |
2010/01/11 06:38:32 |
输入: “([)]” 输出: 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;
}
|