文章目錄 - 1. 題目
- 2. 解題
1. 題目
一個括号字元串是隻由
'(' 和 ')'
組成的 非空 字元串。
如果一個字元串滿足下面 任意 一個條件,那麼它就是有效的:
- 字元串為
.()
- 它可以表示為
(A 與 B 連接配接),其中A 和 B 都是有效括号字元串。AB
- 它可以表示為
,其中 A 是一個有效括号字元串。(A)
給你一個括号字元串 s 和一個字元串 locked ,兩者長度都為 n 。
locked 是一個二進制字元串,隻包含 ‘0’ 和 ‘1’ 。對于 locked 中 每一個 下标 i :
- 如果
,你 不能 改變locked[i] 是 '1'
。s[i]
- 如果
,你 可以 将 s[i] 變為locked[i] 是 '0'
或者'('
。')'
如果你可以将 s 變為有效括号字元串,請你傳回 true ,否則傳回 false 。
示例 1:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2Pn5GcucTO2MGZ2Q2MzUmNkVmYwQDMxADNhZTYxIjZ2cDNjZjZvwVN5EDM4kjNtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
輸入:s = "))()))", locked = "010100"
輸出:true
解釋:locked[1] == '1' 和 locked[3] == '1' ,
是以我們無法改變 s[1] 或者 s[3] 。
我們可以将 s[0] 和 s[4] 變為 '(' ,不改變 s[2] 和 s[5] ,
使 s 變為有效字元串。
示例 2:
輸入:s = "()()", locked = "0000"
輸出:true
解釋:我們不需要做任何改變,因為 s 已經是有效字元串了。
示例 3:
輸入:s = ")", locked = "0"
輸出:false
解釋:locked 允許改變 s[0] 。
但無論将 s[0] 變為 '(' 或者 ')' 都無法使 s 變為有效字元串。
提示:
n == s.length == locked.length
1 <= n <= 10^5
s[i] 要麼是 '(' 要麼是 ')' 。
locked[i] 要麼是 '0' 要麼是 '1' 。
複制
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/check-if-a-parentheses-string-can-be-valid
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
跟 678 題一樣的
class Solution {
public:
bool canBeValid(string s, string locked) {
int n = s.size();
if(n%2==1) return false;
stack<int> l;
stack<int> star;
for(int i = 0; i < s.size(); ++i)
{
if(s[i] == '(' && locked[i] == '1')
l.push(i);
else if(locked[i] == '0')
star.push(i);
else
{
if(l.empty() && star.empty())
return false;//不夠比對
if(!l.empty())
l.pop();
else
star.pop();
}
}
while(!l.empty() && !star.empty())
{
if(l.top() > star.top())// * ( 不能比對
return false;
l.pop();
star.pop();
}
return l.empty();
}
};
複制
80 ms 30.8 MB C++
我的CSDN部落格位址 https://michael.blog.csdn.net/