Leetcode(一) /678

该博客讨论了一种有效的括号字符串检验算法,其中*可以视为*)、(*)或空字符串。通过使用两个栈分别存储'('和'*',遇到')'时尝试匹配左括号或*号。如果所有括号都能正确匹配,栈最终会清空,返回true;否则返回false。示例展示了如何处理不同情况,包括空字符串和包含'*'的情况。
摘要由CSDN通过智能技术生成

1.给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:

  1. 任何左括号 ( 必须有相应的右括号 )。
  2. 任何右括号 ) 必须有相应的左括号 ( 。
  3. 左括号 ( 必须在对应的右括号之前 )。
  4. * 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。
  5. 一个空字符串也被视为有效字符串。

示例 1:

输入: "()"
输出: True
示例 2:

输入: "(*)"
输出: True
示例 3:

输入: "(*))"
输出: True
注意:

字符串大小将在 [1,100] 范围内。

class Solution {
    public boolean checkValidString(String s) {
        Deque<Integer> l = new LinkedList<Integer>();
        Deque<Integer> r = new LinkedList<Integer>();
        int n = s.length();
        for(int i = 0 ; i < n ; i++) {
            char c = s.charAt(i);
            if(c == '(') {
                l.push(i);
            }
            if(c == '*') {
                r.push(i);
            }
            if(c == ')') {
                if(! l.isEmpty()) {
                    l.pop();
                }else if(!r.isEmpty()) {
                    r.pop();
                }else {
                    return false;
                }
            }
        }
        while (!l.isEmpty() && !r.isEmpty()) {
            int lIndex = l.pop();
            int rIndex = r.pop();
            if(lIndex > rIndex) {
                return false;
            }
        }
        return l.isEmpty();
    }
}

注:用两个栈分别存储"("和"*",遇见")"先与左括号匹配,再与*号匹配。当右括号匹配结束,判断两个栈是否为空,因为*号可以为空字符串,所以左括号一定比*号少,当栈里只剩*号时间,结束,返回false。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值