思路
首先,排除奇数情况,然后将未上锁的地方换成X,表示可以任意更换;
考虑不能完成的情况:
1、)左边的 (和X 不能满足配对
2、(右边的 )和X 不能满足配对
虽然猛一看可能会觉得因为X不能来回变,不能这样写。但是,对于一个确定的位置,其左右两边未配对的左/右括号必然相等或是一边多一边少,不会出现两边都多的情况,X补在少的那侧括号即可。
双向扫描实时判断是否有不配对。
代码
class Solution {
public:
bool canBeValid(string s, string locked) {
int n = s.size();
if(n%2 == 1) return false;
for(int i = 0; i < n; i++) {
if(locked[i] == '0') s[i] = 'X';
}
int count = 0;
for(int i = 0; i < n; i++) {
if(s[i] == 'X' || s[i] == '(') count++;
else count--;
if(count < 0) return false;
}
count = 0;
for(int i = n - 1; i >= 0; i--) {
if(s[i] == 'X' || s[i] == ')') count++;
else count--;
if(count < 0) return false;
}
return true;
}
};