给定一个只包含三种字符的字符串:(
,)
和 *
,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:
- 任何左括号
(
必须有相应的右括号)
。 - 任何右括号
)
必须有相应的左括号(
。 - 左括号
(
必须在对应的右括号之前)
。 *
可以被视为单个右括号)
,或单个左括号(
,或一个空字符串。- 一个空字符串也被视为有效字符串。
示例 1:
输入: "()" 输出: True
示例 2:
输入: "(*)" 输出: True
示例 3:
输入: "(*))" 输出: True
注意:
- 字符串大小将在 [1,100] 范围内。
两遍扫描,第一遍从左往右,确定每一个右括号都可以成功配对,第二遍从右往左,确定每一个左括号都可以成功配对
class Solution:
def checkValidString(self, s: str) -> bool:
n = len(s)
left, asterisk = 0, 0
for i in range(n):
if s[i] == "(":
left += 1
elif s[i] == ")":
if left > 0:
left -= 1
elif asterisk > 0:
asterisk -= 1
else:
return False
else:
asterisk += 1
right, asterisk = 0, 0
for i in range(n - 1, -1, -1):
if s[i] == ")":
right += 1
elif s[i] == "(":
if right > 0:
right -= 1
elif asterisk > 0:
asterisk -= 1
else:
return False
else:
asterisk += 1
return True
class Solution {
public boolean checkValidString(String s) {
int n = s.length();
char[] a = s.toCharArray();
int left = 0, asterisk = 0;
for (int i = 0; i < n; i++) {
if (a[i] == '(') {
left++;
} else if (a[i] == ')') {
if (left > 0) {
left--;
} else if (asterisk > 0) {
asterisk--;
} else {
return false;
}
} else {
asterisk++;
}
}
int right = 0;
asterisk = 0;
for (int i = n - 1; i >= 0; i--) {
if (a[i] == ')') {
right++;
} else if (a[i] == '(') {
if (right > 0) {
right--;
} else if (asterisk > 0) {
asterisk--;
} else {
return false;
}
} else {
asterisk++;
}
}
return true;
}
}
class Solution {
public:
bool checkValidString(string s) {
int n = s.size();
int left = 0, asterisk = 0;
for (int i = 0; i < n; ++i) {
if (s[i] == '(') {
++left;
} else if (s[i] == ')') {
if (left > 0)
--left;
else if (asterisk > 0)
--asterisk;
else
return false;
} else {
++asterisk;
}
}
int right = 0;
asterisk = 0;
for (int i = n - 1; i >= 0; --i) {
if (s[i] == ')') {
++right;
} else if (s[i] == '(') {
if (right > 0)
--right;
else if (asterisk > 0)
--asterisk;
else
return false;
} else {
++asterisk;
}
}
return true;
}
};
func checkValidString(s string) bool {
n := len(s)
left, asterisk := 0, 0
for i := 0; i < n; i++ {
if s[i] == '(' {
left++
} else if s[i] == ')' {
if left > 0 {
left--
} else if asterisk > 0 {
asterisk--
} else {
return false
}
} else {
asterisk++
}
}
asterisk = 0
right := 0
for i := n - 1; i >= 0; i-- {
if s[i] == ')' {
right++
} else if s[i] == '(' {
if right > 0 {
right--
} else if asterisk > 0 {
asterisk--
} else {
return false
}
} else {
asterisk++
}
}
return true
}