注:一个有效的括号必须符合以下规律:
a. 从左至右遍历时,任意位置必须满足“左括号的数量”大于等于“右括号的数量”;
b. 从右至左遍历时,任意位置必须满足“右括号的数量”大于等于“左括号的数量”;
- 有效的括号字符串
给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:
任何左括号 ( 必须有相应的右括号 )。
任何右括号 ) 必须有相应的左括号 ( 。
左括号 ( 必须在对应的右括号之前 )。
- 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。
一个空字符串也被视为有效字符串。
示例 1:
输入: “()”
输出: True
示例 2:
输入: “(*)”
输出: True
示例 3:
输入: “(*))”
输出: True
class Solution {
public:
bool checkValidString(string s) {
int n = s.size();
if (n == 0) {
return true;
}
int xCnt = 0;
int lCnt = 0;
int rCnt = 0;
for (int i = 0; i < n; i++) {
if (s[i] == '(') {
lCnt++;
} else if (s[i] == ')') {
rCnt++;
} else {
xCnt++;
}
if ((rCnt - lCnt) > xCnt) {
return false;
}
}
xCnt = 0;
lCnt = 0;
rCnt = 0;
for (int i = n - 1; i >= 0; i--) {
if (s[i] == '(') {
lCnt++;
} else if (s[i] == ')') {
rCnt++;
} else {
xCnt++;
}
if ((lCnt - rCnt) > xCnt) {
return false;
}
}
if (abs(rCnt - lCnt) > xCnt) {
return false;
}
return true;
}
};