lintcode 有效括号的字符串

lintcode 有效括号的字符串

描述

给定一个只包含三种类型字符的字符串:’(’,’)'和 ‘*’, 编写一个函数来检查该字符串是否有效。 我们通过以下规则定义字符串的有效性:

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

样例

输入: “()”
输出: True

输入: “(*)”
输出: True

输入: “(*))”
输出: True

思路

根据题目的意思,形如"()()()“这样的字符串也是可以的。所以不能使用两个指针left和right进行遍历。这也是我一开始犯的错误。如果这样的话我们可以参考堆栈判断括号匹配的思路。这里要注意的就是” * “可以当作” ( “也可以当作” ) ",也可以当作空字符串。
从字符串的开头进行遍历,如果 " * "被当作成 ( ,)的数量还是多于( 的,那么肯定就无效,直接返回false,比如这种情况 " ( * ) ) ) "。因此我们需要不断地记录下( 和 )的数量。
这里我们使用了两个变量Min和Max Min记录的是 * 被当作是 ) 时,(的数量。Max为 * 当作 ( 时, (的数量。
如果遍历到( Min和Max都增1, )都减一, 遍历到*时,Min–, Max++
遍历一次之后对Max进行判断,如果Max<0,说明)的数量过多,返回false,如果没有返回false,说明当作左括号的*略多。如果Min小于0,要变为0,因为可能出现这样的情况 " ( * * ) ( ) ",有效的字符串是分段的。所以判断字符串是否有效,最后需要判断Min,如果Min大于0,说明左括号数量多了,字符串无效。比如这种 " ( ( ( * ) " Min的值为3。注意Min的值不可能是负的。

class Solution {
public:
    /**
     * @param s: the given string
     * @return: whether this string is valid
     */
    bool checkValidString(string &s) {
        // Write your code here
        int Min = 0, Max = 0; 
        for(int i=0; i<s.size(); i++){
            if (s[i] == '(') {
                Min++;
                Max++;   
            }
            if (s[i] == ')') {
                Min--;
                Max--;
            }
            if (s[i] == '*') {
                Min--;
                Max++;
            }
            if(Max < 0) 
               return false;
            Min = max(Min, 0);
      }
        if(Min == 0)
            return true;
        return false;
    }
};


猜你喜欢

转载自blog.csdn.net/qq_40147449/article/details/84037635
今日推荐