当前位置:网站首页>678. 有效的括号字符串
678. 有效的括号字符串
2022-07-01 10:08:00 【hequnwang10】
一、题目描述
给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:
- 任何左括号 ( 必须有相应的右括号 )。
- 任何右括号 ) 必须有相应的左括号 ( 。
- 左括号 ( 必须在对应的右括号之前 )。
- 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。
- 一个空字符串也被视为有效字符串。
示例 1:
输入: "()"
输出: True
示例 2:
输入: "(*)"
输出: True
示例 3:
输入: "(*))"
输出: True
二、解题
两次遍历
正反遍历,从左往右遍历,确定右括号,从右往左遍历,确定左括号。
class Solution {
public boolean checkValidString(String s) {
//两次遍历,正反遍历,先判断左括号是否有对应的右括号
int left = 0,cnt = 0;
int length = s.length();
char[] sch = s.toCharArray();
for(char ch : sch){
if(ch == '('){
left++;
}else if(ch == ')'){
left--;
}else{
cnt++;
}
//判断当前的左括号是否有对应的右括号
if(left < 0){
cnt--;
left++;
}
if(cnt < 0){
return false;
}
}
//从右往左遍历
int right = 0;
cnt = 0;
for(int i = length-1;i>=0;i--){
char ch = sch[i];
if(ch == ')'){
right++;
}else if(ch == '('){
right--;
}else{
cnt++;
}
//判断当前的右括号是否有对应的左括号
if(right < 0){
cnt--;
right++;
}
if(cnt < 0){
return false;
}
}
return true;
}
}
时间复杂度:O(n)
空间复杂度:O(1)
贪心
从左到右遍历字符串,遍历过程中,未匹配的左括号数量可能会出现如下变化:
如果遇到左括号,则未匹配的左括号数量加 1;
如果遇到右括号,则需要有一个左括号和右括号匹配,因此未匹配的左括号数量减 1;
如果遇到星号,由于星号可以看成左括号、右括号或空字符串,因此未匹配的左括号数量可能加 1、减 1 或不变。
基于上述结论,可以在遍历过程中维护未匹配的左括号数量可能的最小值和最大值,根据遍历到的字符更新最小值和最大值:
如果遇到左括号,则将最小值和最大值分别加 1;
如果遇到右括号,则将最小值和最大值分别减 1;
如果遇到星号,则将最小值减 1,将最大值加 1。
任何情况下,未匹配的左括号数量必须非负,因此当最大值变成负数时,说明没有左括号可以和右括号匹配,返回 false。
当最小值为 0 时,不应将最小值继续减少,以确保最小值非负。
遍历结束时,所有的左括号都应和右括号匹配,因此只有当最小值为 0 时,字符串 s 才是有效的括号字符串。
class Solution {
public boolean checkValidString(String s) {
//贪心算法
//定义两个值,记录为匹配的左括号的最大值和最小值
int mincnt = 0,maxcnt = 0;
int length = s.length();
char[] sch = s.toCharArray();
for(int i = 0;i<length;i++){
char ch = sch[i];
if(ch == '('){
mincnt++;
maxcnt++;
}else if(ch == ')'){
mincnt = Math.max(mincnt-1,0);
maxcnt--;
if(maxcnt < 0){
return false;
}
}else{
mincnt = Math.max(mincnt - 1,0);
maxcnt++;
}
}
return mincnt == 0;
}
}
时间复杂度:O(n)
空间复杂度:O(1)
边栏推荐
- If you meet a female driver and drive didi as an amateur, you can earn 500 a day!
- 硬件中台项目
- Live broadcast management project
- 数据中台咋就从“小甜甜”变成了“牛夫人”?
- Some tools used in embedded development
- sql语句修改字段类型「建议收藏」
- CSDN一站式云服务开放内测,诚邀新老用户来抢鲜
- CodeBlocks 左侧项目栏消失,workspace 自动保存项目,Default workspace,打开上次的workspace,工作区(图文教程,已解决)
- Initial experience of Flink, a mainstream real-time stream processing computing framework
- Huawei accounts work together at multiple ends to create a better internet life
猜你喜欢

架构实战营 模块九:设计电商秒杀系统

持续进阶,软通动力稳步推动云智能战略

一个悄然崛起的国产软件,低调又强大!

Win11账号被锁定无法登录怎么办?Win11账号被锁定无法登录

What should I learn in the zero foundation entry test? It's the most comprehensive. Just learn from it

Initial experience of Flink, a mainstream real-time stream processing computing framework

TC8:UDP_USER_INTERFACE_01-08

Zero foundation software testing must see, 10 years of testing old bird's conscience suggestions (a total of 15)

CSDN一站式云服务开放内测,诚邀新老用户来抢鲜

新数据库时代,不要只学 Oracle、MySQL
随机推荐
CSDN's one-stop cloud service is open for internal testing, and new and old users are sincerely invited to grab the fresh
TC8:UDP_ USER_ INTERFACE_ 01-08
好高的佣金,《新程序员》合伙人计划来袭,人人皆可参与!
零基础入行软件测试必看,10年测试老鸟的良心建议(共15条)
C# 一行代码计算文件的MD5值 - CodePlus系列
C [byte array] and [hexadecimal string] mutual conversion - codeplus series
The programmer was beaten.
Module 9: design e-commerce seckill system
Button button clear border
PHP code audit and File Inclusion Vulnerability
Configure load balancing
哪个券商公司炒股开户佣金低又安全又可靠
CentOS configures discuz prompt, please check whether the MySQL module is loaded correctly
Apple amplification! It's done so well
主流实时流处理计算框架Flink初体验
Win11账号被锁定无法登录怎么办?Win11账号被锁定无法登录
PHP 字符串与二进制相互转换
新数据库时代,不要只学 Oracle、MySQL
关于OpenCV中图像的widthStep
全球基金和资管的股票建仓率达到15年内新低