2018.6.28

1089.Valid Parenthesis String
Input: "()"
Output: True

Input: "(*)"
Output: True

Input: "(*))"
Output: True

这道题应该怎么做?用栈当然不行。因为这个题不能精确到每一个符号。
没有星号的情况自然不必说。O(n)走一遍,保证当前(左括号数量-右括号数量)>=0。左括号的数量多一点没关系,因为后面还可以有右括号来补。但是如果当前右括号就多了,那就已经false了。
并且遍历结束的时候==0。
但是有星号的情况下,就不好判断星号是当做左括号来用还是当做右括号来用还是不用。
因此我们在遍历的时候,要记录两个数量。
1.left。当前为左括号的时候,l++。当前为星号的时候,l—-。当前为右括号的时候l—。
    它代表的意思是什么呢?左括号累加,遇到星号的时候,把星号当做右括号使用。但是不会减到负值(如果超出了就把星号当做空值来算)
    遇到右括号的时候,减。但是不会减到负值。
    它其实就是用来表示一个最差的情况,即左括号很多,星号全部被当做右括号使用
        
2.cp。把星号都当做左括号来使用,cp++。遇到右括号cp—-。如果减到负值,说明已经false了。
public class Solution {
    /**
     * @param s: the given string
     * @return: whether this string is valid
     */
    public boolean checkValidString(String s) {
        // Write your code here
        int len = s.length();
        int l=0, cp=0;
        for (int i=0; i<len; i++) {
            if (s.charAt(i) == '(') {
                l++;
                cp++;
            } 
            else if (s.charAt(i) == '*') {
                if (l > 0) {
                    l--;
                }
                cp++;
            } 
            else {
                if (l > 0) {
                    l--;
                }
                cp--;
                if (cp < 0) {
                    return false;
                }
            }
        }
        return l == 0? true: false;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值