Q678 有效的括号字符串

本文探讨了一种检查由括号和星号组成的字符串是否有效的算法。通过定义有效字符串的规则,包括括号配对和星号的灵活解释,提出了一种双方向扫描的方法,确保了括号的正确配对。同时,该方法考虑了星号可能代表的三种情况,实现了对复杂字符串的有效验证。
摘要由CSDN通过智能技术生成

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

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

示例 1:

输入: "()"
输出: True

示例 2:

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

示例 3:

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

注意:

  1. 字符串大小将在 [1,100] 范围内。
public boolean checkValidString(String s) {
        if (s == null || s.length() == 0)
            return true;

        char[] chs = s.toCharArray();
        char[] chsReverse = s.toCharArray();
        for (int i = 0; i < chsReverse.length / 2; i++) {
            char c = chsReverse[i];
            if (chsReverse[chsReverse.length - 1 - i] == '*')
                chsReverse[i] = '*';
            else
                chsReverse[i] = (chsReverse[chsReverse.length - 1 - i] == ')' ? '(' : ')');

            if (c == '*')
                chsReverse[chsReverse.length - 1 - i] = '*';
            else
                chsReverse[chsReverse.length - 1 - i] = (c == ')' ? '(' : ')');
        }

        return check(chs) && check(chsReverse);
    }


    private boolean check(char[] s) {

        int left = 0;
        int right = 0;
        int nil = 0;

        for (char c : s) {
            if (c == '*')
                nil++;
            else if (c == '(')
                left++;
            else if (c == ')')
                right++;

            if (right - left > nil )
                return false;
        }

        if (left + nil < right || right + nil < left)
            return false;

        return true;
    }

转载于:https://www.cnblogs.com/WeichengDDD/p/10739220.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值