判断括号是否有效

输入一个仅包含括号的字符串判断括号是否有效

例如:

  • 有效:"{}" “[]” “()” “{[()]}”…
  • 无效: “(]” “{[](}” “{{[()]}”

第一种方法(暴力匹配字符串)

    /**
	 * 判断括号是否有效
	 * @param str 输入的字符串
	 * @return 括号有效的话返回真
	 */
	public static boolean bracketIsEffect(String str) {
		// 去除空格
		str = str.replace(" ", "");
		while (str.contains("()") || str.contains("[]") || str.contains("{}")) {
			str = str.replace("{}", "");
			str = str.replace("[]", "");
			str = str.replace("()", "");
		}
		return str.isEmpty();
	}
    每次遍历字符串以及对字符串的修改操作都会产生新字符串,因此对内存的消耗很大,效率很低,不建议使用,
但是简单便于理解,适合刚入门的小白使用。

第二种方法(栈)

步骤梳理:
① 遇见左括号,将左括号入栈
② 遇到右括号

  • 如果此时栈是空的,则说明括号无效,返回false
  • 如果栈不为空,则将栈顶括号字符出栈,与右括号匹配
    • 如果左右括号不匹配,则说明无效 返回false
    • 如果匹配,则继续扫描下一个括号字符

③所有字符扫描完毕后

  • 栈为空,说明括号有效,返回true
  • 栈不为空,说明括号无效,返回false

下面看具体实现

    /**
	 * 判断括号是否有效
	 * @param str 输入的字符串    前提:字符串仅包含三种括号字符
	 * @return 括号有效的话返回真
	 */
	public static boolean bracketIsEffectByStack(String str) {
		Stack<Character> stack = new Stack<>();
 		// 去除空格
		str = str.replace(" ", "");
		int len = str.length();
		for (int i = 0; i < len ; i++) {
			char c = str.charAt(i);
			if (c == '{' || c == '[' || c == '(') { //左括号字符
				stack.push(c);
			}else {
				if (stack.isEmpty()) return false;
				
				char left = stack.pop();
				if (left == '(' && c != ')') return false;
				if (left == '[' && c != ']') return false;
				if (left == '{' && c != '}') return false;
					
			}
		}
		
		return stack.isEmpty();
	}

利用 HashMap 简化 方法二

     public static boolean bracketIsEffectByMap(String str) {
		Map<Character, Character> map = new HashMap<>();
		map.put('(', ')');
		map.put('[', ']');
		map.put('{', '}');

		Stack<Character> stack = new Stack<>();
		// 去除空格
		str = str.replace(" ", "");
		int len = str.length();
		for (int i = 0; i < len; i++) {
			char c = str.charAt(i);
			if (map.containsKey(c)) { // 左括号字符
				stack.push(c);
			} else {
				if (stack.isEmpty())
					return false;

				char left = stack.pop();
				if (c != map.get(left))
					return false;

			}
		}

		return stack.isEmpty();
	}

谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值