LeetCode20.有效的括号(两种解法)

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
——1.左括号必须用相同类型的右括号闭合。
——2.左括号必须以正确的顺序闭合。
——3.注意空字符串可被认为是有效字符串。

题目分析

题目要求以正确的顺序闭合:(+)、[+]、{+}
——也就是只能左括号在前,右括号在后面来进行匹配,那么我们可以使用stack,将左括号压入栈,如果后面的括号与之匹配,则将它出栈,继续下一轮匹配。如果是有效的字符串,也就是每对括号都完全匹配,栈最后会为空,另外题目说空字符串也可以认为是有效的,所以最后判断栈是否为空可以知道是否为有效字符串。
——细节的一点:一开始如果没有左括号入栈,此时的栈也是空的,但是没有左括号的情况下,是不能进行匹配的,所以此时是无效的字符串

解法一:Stack

// stack
public boolean isValid(String s) {
	char[] ch = s.toCharArray();
	Stack<Character> stack = new Stack<>();
	for (int i = 0; i < ch.length; i++) {
		if (ch[i] == '(' || ch[i] == '[' || ch[i] == '{') {
			stack.add(ch[i]);
		} else if (!stack.isEmpty()) {
			if (stack.peek() == '(' && ch[i] == ')') {
				stack.pop();
			} else if (stack.peek() == '[' && ch[i] == ']') {
				stack.pop();
			} else if (stack.peek() == '{' && ch[i] == '}') {
				stack.pop();
			} else {
				return false;
			}
		} else {
			return false;
		}
	}
	return stack.isEmpty();
}

解法二:Stack+HashMap

此处用到了HashMap,代码简洁明了:
——先将右括号添加到map中,循环体里面判断元素是否为左括号(不在map中),是左括号直接压入栈;不是左括号的情况下:要么栈为空,要么栈之前有左括号,现在进行左右括号的匹配,匹配不成功直接返回false;
——最后进行stack是否为空的判断。

// HashMap
public boolean isValidByHashMap(String s) {
	char[] ch = s.toCharArray();
	HashMap<Character, Character> map = new HashMap<>();
	Stack<Character> stack = new Stack<>();
	map.put(')', '(');
	map.put(']', '[');
	map.put('}', '{');
	for (int i = 0; i < ch.length; i++) {
		if (!map.containsKey(ch[i])) {
			stack.add(ch[i]);
		} else if (stack.isEmpty() || stack.pop() != map.get(ch[i])) {
			return false;
		}
	}
	return stack.isEmpty();
}

end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值