'('
must have a corresponding right parenthesis ')'
.')'
must have a corresponding left parenthesis '('
.'('
must go before the corresponding right parenthesis ')'
.'*'
could be treated as a single right parenthesis ')'
or a single left parenthesis '('
or an empty string.
Example 1:css
Input: "()" Output: True
Example 2:this
Input: "(*)" Output: True
Example 3:spa
Input: "(*))" Output: True
Note:3d
大体思路是:自左向右遍历时, 记录当前最多能匹配多少右括号(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; } };