题目

一个括号字符串是只由 '('')' 组成的 非空 字符串。如果一个字符串满足下面 任意 一个条件,那么它就是有效的:

  • 字符串为 ().
  • 它可以表示为 ABAB 连接),其中AB 都是有效括号字符串。
  • 它可以表示为 (A) ,其中 A 是一个有效括号字符串。

给你一个括号字符串 s 和一个字符串 locked ,两者长度都为 nlocked 是一个二进制字符串,只包含 '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 变为有效字符串。

示例 4:

输入:s = "(((())(((())", locked = "111111010111"
输出:true
解释:locked 允许我们改变 s[6] 和 s[8]。
我们将 s[6] 和 s[8] 改为 ')' 使 s 变为有效字符串。

提示:

  • n == s.length == locked.length
  • 1 <= n <= 105
  • s[i] 要么是 '(' 要么是 ')'
  • locked[i] 要么是 '0' 要么是 '1'

思路

​ 一看到题目是判断合法括号,就想到了这题好像我会啊,不就是用栈来判断,左括号压栈,右括号出栈,如果栈最后为空,且中间也没有不够用(遇到右括号,但是栈为空导致无元素可以弹出),那么就是合法括号。

​ 如果只有一种括号,这里还可以优化,不需要真正去压栈和出栈,用一个变量,左括号就+1,右括号就-1,直到最后结果为0,且中间不存在任何时候是小于0的情况,就是合法括号。

​ 本题略微有一些变化,求的是是否可以通过改变原始字符串,变成合法括号。一个合法的括号,必然满足如下条件:

  • 长度为偶数,其中一半是左括号,一半是右括号
  • 任意一个前缀,都满足左括号数量大于等于右括号数量
  • 任意一个后缀,都满足右括号数量大于等于左括号数量

​ 只有locked为1的位置,原始括号才不可变,其他位置的原始括号是可变的,即不用管原始括号是什么。具体操作上,我们可以做如下3步校验:

  • 长度为偶数,如果为奇数,肯定不是合法的
  • 对于任意一个前缀,贪心的认为,任何非locked的位置,都变成左括号的情况下,都满足左括号数量大于等于右括号数量
  • 对于任意一个后缀,贪心的认为,任何非locked的位置,都变成右括号的情况下,都满足右号数量大于等于左括号数量

代码

public boolean canBeValid(String s, String locked) {
// 长度为奇数,不可能是合法括号
int n = s.length();
if ((n & 1) == 1) {
return false;
}
char[] chars = s.toCharArray();
char[] lockedChars = locked.toCharArray();
// 任意一个前缀,左括号都大于等于右括号
int left = 0;
for (int i = 0; i < n; i++) {
if (lockedChars[i] == '1' && chars[i] == ')') {
left--;
} else {
left++;
}
if (left < 0) {
return false;
}
}
// 任意一个后缀,右括号都大于等于左括号
int right = 0;
for (int i = n - 1; i >= 0; i--) {
if (lockedChars[i] == '1' && chars[i] == '(') {
right--;
} else {
right++;
}
if (right < 0) {
return false;
}
}
return true;
}

耗时

leetcode每日一题:判断一个括号字符串是否有效的更多相关文章

  1. 【python】Leetcode每日一题-扰乱字符串

    [python]Leetcode每日一题-扰乱字符串 [题目描述] 使用下面描述的算法可以扰乱字符串 s 得到字符串 t : 如果字符串的长度为 1 ,算法停止 如果字符串的长度 > 1 ,执行 ...

  2. LeetCode 每日一题「判定字符是否唯一」

    我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新文章,回复[资料],即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板. 题目 ...

  3. 【JavaScript】Leetcode每日一题-平方数之和

    [JavaScript]Leetcode每日一题-平方数之和 [题目描述] 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c . 示例1: 输入:c = 5 ...

  4. 【JavaScript】【dp】Leetcode每日一题-解码方法

    [JavaScript]Leetcode每日一题-解码方法 [题目描述] 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : 'A' -> 1 'B' -> 2 ... 'Z' -& ...

  5. 【JavaScript】【KMP】Leetcode每日一题-实现strStr()

    [JavaScript]Leetcode每日一题-实现strStr() [题目描述] 实现 strStr() 函数. 给你两个字符串 haystack 和 needle ,请你在 haystack 字 ...

  6. [LeetCode每日一题]81. 搜索旋转排序数组 II

    [LeetCode每日一题]81. 搜索旋转排序数组 II 问题 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 & ...

  7. 【python】Leetcode每日一题-存在重复元素3

    [python]Leetcode每日一题-存在重复元素3 [题目描述] 给你一个整数数组 nums 和两个整数 k 和 t .请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] ...

  8. 【python】Leetcode每日一题-最大数

    [python]Leetcode每日一题-最大数 [题目描述] 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数. 注意:输出结果可能非常大,所以你需要返回一个 ...

  9. 【python】Leetcode每日一题-丑数

    [python]Leetcode每日一题-丑数 [题目描述] 给你一个整数 n ,请你判断 n 是否为 丑数 .如果是,返回 true :否则,返回 false . 丑数 就是只包含质因数 2.3 和 ...

  10. 【python】Leetcode每日一题-最长公共子序列

    [python]Leetcode每日一题-最长公共子序列 [题目描述] 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度.如果不存在 公共子序列 ,返回 0 . ...

随机推荐

  1. 如何高效发布Android AAR包到远程Maven仓库

    本文同步发布于公众号:移动开发那些事如何高效发布Android AAR包到远程Maven仓库 1 背景 在Gradle 7.0之前的版本中,maven插件是发布AAR包到远程Maven仓库的主要工具. ...

  2. MYSQL-收集

    1.MySQL敏感数据进行加密的几种方法小结 AES_ENCRYPT和AES_DECRYPT函数 AES(Advanced Encryption Standard)是一种对称加密算法.在MySQL中, ...

  3. yolov5输出解码实现

    yolov5输出解释--以yolov5s.pt为例 写在前面.这几天在用Tensort部署一个工训赛检测圆环的模型,发现输出怎么都对不上,通过查阅各方资料,便有了这篇文章,希望能帮助到大家 输出维度 ...

  4. SM9-密钥交换

    算法过程 代码实现 ///************************************************************************ // File name: ...

  5. Collection接口与其子接口实现类-----总复习

    数组与集合 1. 集合与数组存储数据概述:集合.数组都是对多个数据进行存储操作的结构,简称Java容器.说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt,.jpg,.avi, ...

  6. PayDay Intermediate

    nmap + dirsearch 发现web站点 扫目录 ┌──(root㉿kali)-[/home/ftpuserr] └─# nmap -p- -A 192.168.167.39 Starting ...

  7. nginx适配Overlay以及测试工具

    本文分享自天翼云开发者社区<nginx适配Overlay以及测试工具>,作者:pan Overlay与Underlay介绍 Overlay网络和Underlay网络是一组相对概念,Over ...

  8. Windows安装MySql时出现“Failed to find valid data directory”的错误

    1.问题描述 具体错误信息如下所示: 2021-08-13T06:18:24.942954Z 0 [System] [MY-010116] [Server] D:\Net_Program\Net_My ...

  9. NIT GREAT NITYACKE DESTROYS THE UNIVERSE

    线段树 一般线段树维护的东西是什么?设其维护的信息的半群 \((A,+)\),维护标记的半群 \((T,\times)\) 和一种运算 \(*\mapsto A*T\to A\). 要求 \((b+c ...

  10. Kafka常用命令总结

    1.清空某个topic数据 需要在service设置delete.topic.enable=true ./bin/kafka-topics.sh --zookeeper 172.23.75.105:2 ...