给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:
任何左括号 ( 必须有相应的右括号 )。
任何右括号 ) 必须有相应的左括号 ( 。
左括号 ( 必须在对应的右括号之前 )。
* 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。
一个空字符串也被视为有效字符串。
示例 1:
输入: "()"
输出: True
示例 2:
输入: "(*)"
输出: True
示例 3:
输入: "(*))"
输出: True
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parenthesis-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
bool checkValidString(string s) {
//左括号的匹配情况的取值范围
int high = 0, low = 0;
for (char ch : s) {
if (ch == '(') {
high++;
low++;
}
if (ch == '*') {
high++;
//下限最小为0,说明左括号“能够”被匹配完。指 ( <= ) + * -> ( 可以等于 )
low = max(0, low - 1);
}
if (ch == ')') {
high--;
low = max(0, low - 1);
//说明 ( + * < ) -> ( < ),不能被匹配
if (high < 0) {
return false;
}
}
}
//若 low > 0 说明 * +) < (,不能匹配
return low == 0;
}
};