LeetCode 20. 有效的括号(java)

本文介绍了一种使用栈数据结构来验证括号是否正确配对的方法。提供了两种不同的实现方案,详细解释了每一步的逻辑,并通过示例展示了如何判断一个包含括号的字符串是否有效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例:
在这里插入图片描述
代码:

  • 解法一
class Solution {
   public boolean isValid(String s) {
   //使用栈实现
		Stack<Character> stack = new Stack<Character>();
		//遍历字符串中的每个字符
		for (int i = 0; i < s.length(); i++) {
		//如果为空 直接将字符进栈
			if (stack.isEmpty()) {
				stack.push(s.charAt(i));
			} else {	
				if (stack.peek() - s.charAt(i) == -1 || stack.peek() - s.charAt(i) == -2) {  //如果两个相匹配 弹栈()差1 {} []差2
					stack.pop();
				} else {	//如果两个不匹配 进栈
					stack.push(s.charAt(i));
				}
			}
		}
		if (stack.isEmpty()) {	//判断栈是否为空 (如果全部匹配栈为空)
			return true;
		} else {
			return false;
		}
	}
}

  • 解法二
class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        //foreach遍历 
        for (char c : s.toCharArray()) {
            if (c=='(' || c=='[' || c=='{') {	//如果为( { [则进栈
                stack.push(c);
            } else {
                if (stack.empty()) return false;	//栈为空 所以返回false
                if (c==')' && stack.pop()!='(') return false;	//有) 但没有左边的相匹配 所以返回false
                if (c==']' && stack.pop()!='[') return false;	//有]但没有左边的相匹配 所以返回false
                if (c=='}' && stack.pop()!='{') return false;	//有}但没有左边的相匹配 所以返回false
            }
        }
        return stack.empty();	//根据else中栈是否为空的情况返回 true/false
    }
}
  • 别人的代码
class Solution {
    public boolean isValid(String s) {
        boolean result = false;
        String[] stack = new String[s.length()];
        int r = 0;
        if(s.length() == 0) return true;
        for (int i = 0; i <s.length(); i ++){
            switch (s.substring(i,i+1)){
                case "(":
                    stack[r] = "(";
                    r++;
                    break;
                case "[":
                    stack[r] = "[";
                    r++;
                    break;
                case "{":
                    stack[r] = "{";
                    r++;
                    break;
                case ")":
                    if (r == 0) return false;
                    if(stack[r-1] != "(")
                        return false;
                    else r--;
                    break;
                case "]":
                    if (r == 0) return false;
                    if(stack[r-1] != "[")
                        return false;
                    else r--;
                    break;
                case "}":
                    if (r == 0) return false;
                    if(stack[r-1] != "{")
                        return false;
                    else r--;
                    break;
            }
        }
        if(r == 0) return true;
    else return false;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值