678. 有效的括号字符串

678. 有效的括号字符串

难度:中等
题目描述
在这里插入图片描述

解题思路

1、抄的答案

思路好巧妙,反正我自己肯定想不出来
在这里插入图片描述

/*
				  * 678. 有效的括号字符串
				  * 2020/8/24
				  */
				 public boolean checkValidString(String s) {
					 
					 int left = 0,right = 0; 
					 //加上*号之后,未匹配左括号的数量从一个值变成了一个范围,用两个变量来记录这个范围的上界和下界
					 for (int i = 0; i < s.length(); i++) {
						char c = s.charAt(i);
						if(c == '(') {
							left++;
							right++;
						}else if(c == '*') {//如果left不为空,说明左括号比较多,*作为右括号
							if(left > 0)
								left--;
							right++;
						}else {  //如果是右括号
							if(left > 0)
								left--;
							right--;
							
						}
						if(right < 0) { //right<0 说明把*当作右括号也不够左括号数量
							return false;
						}
					
					}

在这里插入图片描述

双栈匹配

还是可以用传统括号匹配的方式,用栈模拟

public boolean checkValidString(String s) {
						Stack<Integer> left = new Stack<>();
						Stack<Integer> star = new Stack<>();
						for (int i = 0; i < s.length(); i++) {
							char c = s.charAt(i);
							if(c == '(') {
								left.push(i);
							}else if(c == '*') {
								star.push(i);
							}else { //如果是右括号,寻找匹配
								if(!left.isEmpty()) {
									left.pop();
								}else if(!star.isEmpty()) {
									star.pop();
								}else {
									return false;
								}
							}
						}
						
						//处理剩下的,只有左括号下小于※下标才能匹配上
						while(!left.isEmpty()) {
							if(!star.isEmpty() && left.pop() < star.pop()) {
								continue;
							}else {
								return false;
							}
						}
						return true;

					}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值