5948:判断一个括号字符串是否有效

This commit is contained in:
huangge1199@hotmail.com 2021-12-26 14:42:18 +08:00
parent 290e6d3737
commit d31d69fb56
2 changed files with 152 additions and 0 deletions

View File

@ -0,0 +1,95 @@
//一个括号字符串是只由 '(' ')' 组成的 非空 字符串如果一个字符串满足下面 任意 一个条件那么它就是有效的
//
//
// 字符串为 ().
// 它可以表示为 ABA B 连接其中A B 都是有效括号字符串
// 它可以表示为 (A) 其中 A 是一个有效括号字符串
//
//
// 给你一个括号字符串 s 和一个字符串 locked 两者长度都为 n locked 是一个二进制字符串只包含 '0' '1' 对于
//locked 每一个 下标 i
//
//
// 如果 locked[i] '1' 不能 改变 s[i]
// 如果 locked[i] '0' 可以 s[i] 变为 '(' 或者 ')'
//
//
// 如果你可以将 s 变为有效括号字符串请你返回 true 否则返回 false
//
//
//
// 示例 1
//
//
//
//
//输入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
// s[i] 要么是 '(' 要么是 ')'
// locked[i] 要么是 '0' 要么是 '1'
//
// 👍 4 👎 0
package leetcode.editor.cn;
//5948:判断一个括号字符串是否有效
class CheckIfAParenthesesStringCanBeValid{
public static void main(String[] args) {
//测试代码
Solution solution = new CheckIfAParenthesesStringCanBeValid().new Solution();
}
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public boolean canBeValid(String s, String locked) {
int n = s.length();
int min = 0;
int max = 0;
for (int i = 0; i < n; i++) {
if (locked.charAt(i) == '0') {
min = Math.max(min - 1, 0);
max += 1;
} else if (s.charAt(i) == '(') {
min += 1;
max += 1;
} else {
min = Math.max(min - 1, 0);
max -= 1;
if (max < 0) {
return false;
}
}
}
return min == 0 && max % 2 == 0;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,57 @@
<p>一个括号字符串是只由&nbsp;<code>'('</code>&nbsp;<code>')'</code>&nbsp;组成的&nbsp;<strong>非空</strong>&nbsp;字符串。如果一个字符串满足下面 <b>任意</b>&nbsp;一个条件,那么它就是有效的:</p>
<ul>
<li>字符串为&nbsp;<code>()</code>.</li>
<li>它可以表示为 <code>AB</code><span style=""></span><code>A</code>&nbsp;&nbsp;<code>B</code>&nbsp;连接),其中<code>A</code>&nbsp;<code>B</code>&nbsp;都是有效括号字符串。</li>
<li>它可以表示为&nbsp;<code>(A)</code>&nbsp;,其中&nbsp;<code>A</code>&nbsp;是一个有效括号字符串。</li>
</ul>
<p>给你一个括号字符串&nbsp;<code>s</code>&nbsp;和一个字符串&nbsp;<code>locked</code>&nbsp;,两者长度都为&nbsp;<code>n</code>&nbsp;<code>locked</code>&nbsp;是一个二进制字符串,只包含&nbsp;<code>'0'</code>&nbsp;&nbsp;<code>'1'</code>&nbsp;。对于&nbsp;<code>locked</code>&nbsp;&nbsp;<strong>每一个</strong>&nbsp;下标&nbsp;<code>i</code> </p>
<ul>
<li>如果&nbsp;<code>locked[i]</code>&nbsp;&nbsp;<code>'1'</code>&nbsp;,你 <strong>不能</strong>&nbsp;改变&nbsp;<code>s[i]</code>&nbsp;</li>
<li>如果&nbsp;<code>locked[i]</code>&nbsp;&nbsp;<code>'0'</code>&nbsp;,你&nbsp;<strong>可以</strong>&nbsp;&nbsp;<code>s[i]</code>&nbsp;变为&nbsp;<code>'('</code>&nbsp;或者&nbsp;<code>')'</code>&nbsp;</li>
</ul>
<p>如果你可以将 <code>s</code>&nbsp;变为有效括号字符串,请你返回&nbsp;<code>true</code>&nbsp;,否则返回&nbsp;<code>false</code>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2021/11/06/eg1.png" style="width: 311px; height: 101px;" /></p>
<pre>
<b>输入:</b>s = "))()))", locked = "010100"
<b>输出:</b>true
<b>解释:</b>locked[1] == '1' 和 locked[3] == '1' ,所以我们无法改变 s[1] 或者 s[3] 。
我们可以将 s[0] 和 s[4] 变为 '(' ,不改变 s[2] 和 s[5] ,使 s 变为有效字符串。</pre>
<p><strong>示例 2</strong></p>
<pre>
<b>输入:</b>s = "()()", locked = "0000"
<b>输出:</b>true
<b>解释:</b>我们不需要做任何改变,因为 s 已经是有效字符串了。
</pre>
<p><strong>示例 3</strong></p>
<pre>
<b>输入:</b>s = ")", locked = "0"
<b>输出:</b>false
<b>解释:</b>locked 允许改变 s[0] 。
但无论将 s[0] 变为 '(' 或者 ')' 都无法使 s 变为有效字符串。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>n == s.length == locked.length</code></li>
<li><code>1 &lt;= n &lt;= 10<sup>5</sup></code></li>
<li><code>s[i]</code>&nbsp;要么是&nbsp;<code>'('</code>&nbsp;要么是&nbsp;<code>')'</code>&nbsp;</li>
<li><code>locked[i]</code> 要么是&nbsp;<code>'0'</code>&nbsp;要么是&nbsp;<code>'1'</code></li>
</ul>
<div><li>👍 4</li><li>👎 0</li></div>