括号是否匹配-java版

题目描述

这是leetcode上的题。
原题链接

Given a string containing just the characters ‘(’, ‘)’, ‘{’, ‘}’, ‘[’ and ‘]’, determine if the input string is valid.

An input string is valid if:

Open brackets must be closed by the same type of brackets.
Open brackets must be closed in the correct order.
Note that an empty string is also considered valid.

Example 1:

Input: “()”
Output: true

Example 2:

Input: “()[]{}”
Output: true

Example 3:

Input: “(]”
Output: false

Example 4:

Input: “([)]”
Output: false

Example 5:

Input: “{[]}”
Output: true

算法分析

匹配括号是一个老问题了。基本上是用栈来实现。
java语言下可以使用自带的栈类。

创建对象

首先,我创建了两个栈,一个栈为括号栈bracketStack,用来存放题目所给的括号串。然后,我创建了另一个栈,后栈postStack,用来存放暂时未匹配的括号。

压栈操作

在给bracketStack压栈时,先判断括号串是否为空和是否为奇数。当括号串为空时,直接返回true,当括号串为奇数时,由于其必定不匹配,所以返回false然后,在压栈的时候我将’{’ ‘[’ ‘(’ ‘)’ ‘]’ '}'分别用1,2,3,4,5,6来表示。

弹栈操作

压栈结束后,该进行弹栈。
在遍历bracketStack时,每次循环首先判断postStack是否为空。若为空,则bracketStack所弹出的括号必须为右括号,否者return false。然后,将弹出的括号压栈入postStack。
若postStack不为空,则首先获取bracketStack和postStack的栈顶,分别存入元素a和b中。然后,判断a和b是否匹配。在我的括号表示形式下,若a+b=7则表示a与b相匹配。
若a与b匹配,则两个栈都执行弹栈。若两元素不匹配,则看a是否为右括号。若a为右括号,则将a压栈入postStack。若a是左括号,又因为它不与b匹配,则return false。
将bracketStack遍历完后,看postStack是否为空。若postStack为空,则可以认为题目所给的括号串匹配,否者不匹配。

java代码实现

class Solution {
    public boolean isValid(String s) {
        		Stack<Integer> bracketStack = new Stack<>();
		Stack<Integer> postStack = new Stack<>();
		int lengthen = s.length();
		if (lengthen == 0) {
			return true;
		} else if ((lengthen&1)==1) {
			return false;
		} else {
			for (int i = 0; i < lengthen; i++) {
				switch (s.charAt(i)) {
				case '{':
					bracketStack.push(1);
					break;
				case '[':
					bracketStack.push(2);
					break;
				case '(':
					bracketStack.push(3);
					break;
				case ')':
					bracketStack.push(4);
					break;
				case ']':
					bracketStack.push(5);
					break;
				case '}':
					bracketStack.push(6);
					break;
				default:
					break;
				}
			}
		}
		int a, b;
		for (int i = 0; i < lengthen; i++) {
			if (postStack.isEmpty()) {
				b = bracketStack.pop();
				if (b < 4) {
					return false;
				} else {
					postStack.push(b);
					continue;
				}
			} else {
				a = postStack.peek();
				b = bracketStack.peek();
				if (7 == (a + b)) {
					postStack.pop();
					bracketStack.pop();
				} else {
					if (b > 3) {
						postStack.push(b);
						bracketStack.pop();
						continue;
					} else {
						return false;
					}
				}
			}
		}
		if (postStack.isEmpty()) {
			return true;
		}else {			
			return false;
		}
    }
}

最后的最后,看完后不烦点个赞。
若各位大佬们有对本算法有一些建议也还望在评论中说出。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值