leetcode 678. Valid Parenthesis String

678. Valid Parenthesis String
Medium
Given a string containing only three types of characters: '(', ')' and '*', write a function to check whether this string is valid. We define the validity of a string by these rules:
  1. Any left parenthesis '(' must have a corresponding right parenthesis ')'.
  2. Any right parenthesis ')' must have a corresponding left parenthesis '('.
  3. Left parenthesis '(' must go before the corresponding right parenthesis ')'.
  4. '*' could be treated as a single right parenthesis ')' or a single left parenthesis '(' or an empty string.
  5. An empty string is also valid.

 

Example 1:css

Input: "()"
Output: True

 

Example 2:this

Input: "(*)"
Output: True

 

Example 3:spa

Input: "(*))"
Output: True

 

Note:3d

  1. The string size will be in the range [1, 100].

大体思路是:自左向右遍历时, 记录当前最多能匹配多少右括号(high表示),至少还要匹配多少右括号(low表示)。由于high的数值对后面的右括号还起做用,要维护这一变量,当某一时刻low<0时。说明右括号对于左侧过多。*号能根据后面右括号的状况而变化,遍历过程当中只要low>=0,就好了。当遍历到一个左括号是,标志着它能用于抵消后面的右括号,也标志着,后面必需要有右括号或*号与其抵消。code

相似只有'(' 和 ')' 的状况,count分别加减1,看是否最终等于0. 这里存在*状况,因此变为[low, high]blog

时间复杂度O(n),空间复杂度O(1).

three

class Solution {
public:
    bool checkValidString(string s) {
        if (s.size() == 0){
            return true;
        }
        int low = 0, high = 0;
        
       for (int i = 0; i < s.length(); i++) {
            if (s[i] == '(') {
                low++;
                high++;
            } else if (s[i] == ')') {
                if (low > 0) {
                    low--;
                }
                high--;
            } else {
                if (low > 0) {
                    low--;
                }
                high++;
            }
            if (high < 0) {
                return false;
            }
        }
        return low == 0;
    }
};
相关文章
相关标签/搜索