题目:2116. 判断一个括号字符串是否有效
思路:合法的字符串,任何前缀字字符串都符合:左括号“(”大于有括号“)”的数量
时间复杂度0(n),细节注释。
C++版本:
class Solution {
public:
bool canBeValid(string s, string locked) {
int n=s.size();
//奇数直接寄
if(n%2) return false;
//ans记录“(”的数量、cnt记录可变的符号数
int ans=0,cnt=0;
for(int i=0;i<n;i++){
if(locked[i]=='0') cnt++;
else{
if(s[i]=='(') ans++;
else{
//遇到“)”就需要处理了
if(ans>0) ans--;
else if(cnt>0) cnt--;
else return false;
}
}
}
//再逆向来一遍,避免最右边的(不能被匹配的情况
ans=0,cnt=0;
for(int i=n-1;i>=0;i--){
if(locked[i]=='0') cnt++;
else{
if(s[i]==')') ans++;
else{
if(ans>0) ans--;
else if(cnt>0) cnt--;
else return false;
}
}
}
return true;
}
};
JAVA版本:
class Solution {
public boolean canBeValid(String s, String locked) {
int n=s.length();
if(n%2==1) return false;
int ans=0,cnt=0;
for(int i=0;i<n;i++){
if(locked.charAt(i)=='0') cnt++;
else{
if(s.charAt(i)=='(') ans++;
else{
if(ans>0) ans--;
else if(cnt>0) cnt--;
else return false;
}
}
}
ans=0;
cnt=0;
for(int i=n-1;i>=0;i--){
if(locked.charAt(i)=='0') cnt++;
else{
if(s.charAt(i)==')') ans++;
else{
if(ans>0) ans--;
else if(cnt>0) cnt--;
else return false;
}
}
}
return true;
}
}