学习目标:
目标:熟练运用Java所学知识
学习内容:
本文内容:使用Java实现括号匹配
题目描述:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([)]”
输出:false
示例 5:
输入:s = “{[]}”
输出:true
解题思路:
解决括号匹配问题需要用到栈,当遇到左括号是入栈,遇到右括号出栈,判断出栈元素是否与此时的右括号是否匹配,不匹配则返回false
- 创建栈
- 遇到左花括号,入栈
- 遇到左中括号,入栈
- 遇到左圆括号,入栈
-
遇到右圆括号,出栈,顶判断是否和右圆括号匹配
-
我们发现是匹配的,则继续遍历
-
遇到右方括号,出栈,顶判断是否和方圆括号匹配
-
我们发现是匹配的,则继续遍历
-
遇到右花括号,出栈,顶判断是否和花圆括号匹配
-
我们发现是匹配的,则继续遍历
此时全部遍历完成,而且栈是空的,所以这个是匹配的
实现代码
- 方法一:
public static boolean isValid(String s) {
Stack<Character> stack = new Stack<>();//创建栈
//for循环遍历栈
for(int i=0;i<s.length();i++){
char c=s.charAt(i);//获取当前位置元素
//当此时是左括号时,入栈
if(c=='('||c=='{'||c=='['){
stack.push(c);
}
//如果此时不是左括号(是右括号)并且栈为空,说明括号不匹配,则返回false
if(stack.isEmpty()){
return false;
}
//当前元素时右括号
if(c==')'||c==']'||c=='}'){
Character top = stack.pop();
//判断括号是否匹配
if((top=='('&&c!=')')||(top=='['&&c !=']')||(top=='{'&&c!='}')){
return false;
}
}
}
if (stack.isEmpty()) {
return true;
}
return false;
}
- 方法二:
public static boolean isValid(String s) {
Stack<Character> stack = new Stack<>();//创建栈
//for循环遍历栈
for(int i=0;i<s.length();i++){
char c=s.charAt(i);//获取当前元素、
//如果当前元素时左圆括号,则入栈右圆括号
//如果当前元素时左方括号,则入栈右方括号
//如果当前元素时左花括号,则入栈右花括号
if(c=='('){
stack.push(')');
}else if(c=='{'){
stack.push('}');
}else if(c=='['){
stack.push(']');
}else if(stack.isEmpty()||c!=stack.pop()){
//判断是否匹配
return false;
}
}
if(stack.isEmpty()){
return true;
}
return false;
}