LeetCode第20题---有效的括号

LeetCode第20题—有效的括号


问题描述

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

有效字符串需满足:

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

示例 1:

输入: “()”
输出: true
示例 2:

输入: “()[]{}”
输出: true
示例 3:

输入: “(]”
输出: false
示例 4:

输入: “([)]”
输出: false
示例 5:

输入: “{[]}”
输出: true

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思想

初步想法
对于这种括号的匹配,我们可以使用栈来实现,栈是先进后出的,符合题目的要求。
例如:{())}
首先是 { ,发现第一个不是},所以进栈。
然后是( ,发现第一个是{,所以进栈。
然后是),发现第一个是(,可以抵消,所以)出栈。
然后是),发现第一个是},所以进栈。
然后是 },发现第一个是),不匹配进栈。

除此之外
我们在进栈的同时需要判断左括号的顺序是否正确。对于不正确的我们返回false。(因为这道题最后运行时没要求)
但是如果有要求的话,我们判断stack的最后一个元素和要进栈的元素的ASCII码就可以比较顺序了

而且
右括号是不可以进栈的,一旦进栈的话就说明无法匹配。

测试用例
情况一:输入为空 “ ”,判断为有效字符串(空字符串)
情况二:输入为“{([])}”,判断为有效字符串
情况三:输入为“({})”,判断为有效字符

代码

class Solution {
	/**
	 * 有效的括号
	 * @param s
	 * @return
	 */
	public boolean isValid(String s) {
		
		//定义一个“栈”
		Stack<Character> stack=new Stack<Character>();
	
		
		//循环处理
		for(int i=0;i<s.length();i++){
			
			if(stack.isEmpty()){
				//如果栈为空,并且为右括号,直接返回fasle
				if(s.charAt(i)==')'||s.charAt(i)=='}'||s.charAt(i)==']'){
					return false;
				}
				
				//如果栈为空,是左括号
				stack.push((Character)s.charAt(i));
				
			}else{//如果栈不为空
				//栈不为空遇到左括号时
				if(s.charAt(i)=='('||s.charAt(i)=='{'||s.charAt(i)=='['){
					
//					//如果括号顺序不对的话,返回false
//					if(s.charAt(i)>stack.lastElement()){
//						return false;
//					}
					stack.push((Character)s.charAt(i));	
			}else{//栈不为空,遇到右括号时
				if((s.charAt(i)=='}' && stack.lastElement()=='{' )||(s.charAt(i)==')' && stack.lastElement()=='(')|| (s.charAt(i)==']' && stack.lastElement()=='[')){
					
					//如果相同的话,出栈
					stack.pop();
				}else{//栈不为空,遇到右括号,然后不匹配时
					//System.out.println(stack.lastElement());
					//System.out.println(s.charAt(i));
					return false;
				}
				
			}
			
		}

    }
		if(stack.isEmpty()){
			return true;
		}
		return false;

}
}

总结

stack的数据结构用于解决这种括号匹配问题是最好不过了。
然后就是关于{ 和 ( 和 [ 的顺序比较的话,直接比较ASCII码就可以了。
运行结果
完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值