码迷,mamicode.com
首页 > 其他好文 > 详细

Q678 有效的括号字符串

时间:2019-04-19 22:40:22      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:输出   none   edit   als   范围   list   规则   table   int   

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

  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;
    }

Q678 有效的括号字符串

标签:输出   none   edit   als   范围   list   规则   table   int   

原文地址:https://www.cnblogs.com/WeichengDDD/p/10739220.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!