【Leetcode 力扣 20】有效的括号,括号匹配,给定一个只包括 ‘(‘,‘)‘,‘{‘,‘}‘,‘[‘,‘]‘ 的字符串 s ,判断字符串是否有效。

学习目标:

目标:熟练运用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;
}

猜你喜欢

转载自blog.csdn.net/zhangxxin/article/details/114673028