题目
- 给一个字符串,由
'('and')'组成 - 给一个数组,和字符串长度一致
- 若对应 index 为 0 表示,括号可以变换为
'('or')' - 若对应 index 为 1 表示,表示当前字符不可动
- 判断经过变动,字符串是否可以是一个 valid 的括号对
思路
-
若字符串的长度为 odd,则不可能为 valid 的
-
遍历字符串的过程中,用两个 stack 进行记录
- 一个是所有 unlock 的 index,这些可以自由组合自由变化
- 一个是 lock 的
( - 对于 lock 的
), 优先和 lock 的(配对,再和 unlock 中的 top 配对
-
遍历结束后,lock 的
(和 unlock 的元素进行搭配,判断其 index 是否满足需求,若可以配对完 lock stack 中的元素,则表明是一个 valid 的字符串,否则不是
代码
class Solution {
public:
bool canBeValid(string s, string locked) {
if (s.size() & 1) return false;
stack<int> st_lock;
stack<int> unlock;
for (int i = 0; i < s.size(); i++) {
if (locked[i] == '0') {
unlock.push(i);
continue;
}
if (s[i] == '(') {
st_lock.push(i);
}
if (s[i] == ')') {
if (st_lock.empty() && unlock.empty()) return false;
if (st_lock.empty() == false) st_lock.pop();
else unlock.pop();
}
}
while (!st_lock.empty()) {
if (unlock.empty()) return false;
if (st_lock.top() < unlock.top()) {
st_lock.pop();
unlock.pop();
continue;
}
return false;
}
return true;
}
};