73、有效的括号字符串

题目描述:
思路:我的思路就是一开始尽可能的把字符串中的左括号或者右括号去掉,放入到list中,然后我们根据list中出现的左括号或者右括号进行循环,如果出现左括号则从list的零索引开始,如果是出现右括号,那么从list.size - 1开始这点我思考了很久,因为如果是左括号你需要右边出现*,如果是只出现右括号则你需要左边出现*,因此这两点需要注意

class Solution {
    public boolean checkValidString(String s) {
          
	   
		char tem[] = s.toCharArray();
		List<Character> list = new ArrayList<>();
		for (int i = 0; i < tem.length; i++) {
			if(tem[i] == ')'){
				if(list.size() == 0){
					return false;
				}else {
					int j = list.size() - 1;
					for ( ; j >= 0; j--) {
						if(list.get(j) == '('){
							list.remove(j);
							break;
						}
					}
					if(j == -1){
//						说明找到这里都没有找到左括号
						int x = list.size() - 1;
						for (; x >= 0; x--) {
							if(list.get(x) == '*'){
								list.remove(x);
								break;
							}
						}
						if(x == -1){
							return false;
						}
					}
					
				}
			}else  {
				list.add(tem[i]);
			}
		}
		
//		把左括号或者右括号消掉
        
        System.out.println(list.toString());
//        s1用于计算出现过几次*
       
        
//        如果消到最后只剩下左括号
        if(list.contains('(')){
        	System.out.println("出现的"+"(");
//        	s1计算左括号出现的次数
        	 int s1 = 0;
//             s2计算*出现的次数
        	 int s2 = 0;
        	for (int i = list.size() - 1; i >= 0; i--) {
    			if(list.get(i) == '*'){
    				s2 ++;
    			}else {
					if(s2 <= 0){
						return false;
					}else {
						s2 --;
					}
				}
    		}	
        	return true;
//            如果消到最后只剩下右括号
        }else if(list.contains(')')) {
//        	s1计算右括号出现的次数
        	 int s1 = 0;
//             s2计算*出现的次数
        	 int s2 = 0;
        	 
        	 for (int i = 0; i < list.size(); i++) {
     			if(list.get(i) == '*'){
     				s2 ++;
     			}else {
 					if(s2 <= 0){
 						return false;
 					}else {
						s2--;
					}
 				}
     		}	
         
        	 return true;
        	 
		}
        
        
        return true;
    }
}

自己的代码还是有很多冗余,看看这个代码

class Solution {
    public boolean checkValidString(String s) {
        int low = 0; // 表示*号都作为右括号时,左括号的数量
        int hight = 0; // 表示*都作为左括号时,左括号的数量
        // 如果hight < 0 说明*都作为左括号了,还是不够抵消不了右括号
        // 如果low > 0 说明*号都作为右括号了,还是抵消不了括号的值
        for (int i=0; i<s.length();i++){
            char tmp = s.charAt(i);
            if (tmp == '(') {
                low++;
                hight++;
            } else if (tmp == ')') {
                if (low > 0) {
                    low--;
                }
                hight--;
            } else if (tmp == '*') {
                if (low > 0) {
                    low--;
                }
                hight++;
            }
            
            if (hight < 0) {
                return false;
            }
        }
        return low == 0;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值