【算法】有效的括号字符串

难度:中等

题目:

给你一个只包含三种字符的字符串,支持的字符类型分别是 ‘(’、‘)’ 和 ‘*’。请你检验这个字符串是否为有效字符串,如果是 有效 字符串返回 true 。

有效 字符串符合如下规则:

  • 任何左括号 ‘(’ 必须有相应的右括号 ‘)’。
  • 任何右括号 ‘)’ 必须有相应的左括号 ‘(’ 。
  • 左括号 ‘(’ 必须在对应的右括号之前 ‘)’。
  • ‘*’ 可以被视为单个右括号 ‘)’ ,或单个左括号 ‘(’ ,或一个空字符串 “”。

示例 1
输入:s = “()”
输出:true

示例 2
输入:s = “(*)”
输出:true

示例 3
输入:s = “(*))”
输出:true

提示
1 <= s.length <= 100
s[i] 为 ‘(’、‘)’ 或 ‘*’

解题思路:

  1. 初始化两个计数器:定义两个变量,leftMin和leftMax,初始值均为0。leftMin用来记录在最不利情况下(即尽量多使用星号作为左括号)剩余未匹配的左括号最小数量,而leftMax用来记录在最有利情况下(即尽量多使用星号作为右括号)剩余未匹配的左括号最大数量。
  2. 遍历字符串:遍历输入字符串s的每一个字符。
  • 遇到左括号(时,leftMin和leftMax都增加1,因为左括号明确增加了待匹配的数量。
  • 遇到右括号)时,leftMin和leftMax都减1,表示消耗一个匹配的机会。但是,为了确保leftMin不会变成负数(表示右括号多于左括号),如果leftMin大于0才减1。同时,如果leftMax减到0以下,说明右括号太多了,直接返回false,因为即使所有星号都作为右括号也不够匹配。
  • 遇到星号*时,它既可以作为左括号也可以作为右括号,因此leftMax增加1(考虑它作为右括号),同时为了最坏情况(尽量让星号充当左括号),leftMin减1(但同样要确保leftMin不小于0,防止过度消耗左括号)。
  1. 检查结果:遍历完成后,如果leftMin等于0,说明即使在最不利情况下所有的左括号也得到了匹配,返回true;否则,返回false。

为什么这种方法有效?
这种方法巧妙地利用了星号的双重角色,通过维护两个边界(最小和最大可能的左括号匹配数),有效地判断了在任何合理的星号分配策略下,字符串中的括号是否可以被正确匹配。这种方法避免了复杂的回溯或动态规划,实现了线性时间复杂度的解决方案。

JavaScript 实现

function checkValidString(s) {let leftMin = 0, leftMax = 0;// 前向遍历,同时跟踪最小和最大可能的左括号数量for (let char of s) {if (char === '(') {leftMin++; // 左括号最小计数增加leftMax++; // 左括号最大计数增加} else if (char === ')') {if (leftMin > 0) leftMin--; // 优先减少最小左括号计数,模拟最优情况leftMax--; // 减少最大左括号计数if (leftMax < 0) return false; // 如果最大左括号计数小于0,说明右括号过多} else { // char === '*'if (leftMin > 0) leftMin--; // 可选减少最小左括号计数leftMax++; // 星号也可以作为右括号,所以最大左括号计数可以增加}}// 最终检查:最小左括号计数必须为0,确保所有左括号至少能被匹配return leftMin === 0;
}// 测试例子
console.log(checkValidString("(*))")); // 应该输出true

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/49639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gitee设置ssh公钥密码频繁密码验证

gitee中可以创建私有项目&#xff0c;但是在clone或者push都需要输入密码&#xff0c; 比较繁琐。 公钥则可以解决该问题&#xff0c;将私钥放在本地&#xff0c;公钥放在gitee上&#xff0c;当对项目进行操作时带有的私钥会在gitee和公钥进行验证&#xff0c;避免了手动输入密…

C语言数据结构课设:基于EasyX前端界面的飞机订票系统

数据结构课程设计说明书 学 院、系&#xff1a; 软件学院 专 业&#xff1a; 软件工程 班 级&#xff1a; 学 生 姓 名&#xff1a; 范 学 号&#xff1a; 设 计 题 目&#xff1a; 飞机订票系统 起 迄 日 期: 2024年6月18日~ 20…

【测试能力提升-AI】AI介绍

注释&#xff1a; 搞python的最终梦想&#xff0c;搞机器&#xff0c;玩深度&#xff0c;通网络&#xff0c;知模型&#xff0c;拿下AI技术&#xff0c;尽管只是测试&#xff0c;但是也是有梦想的 1. 目标 完成AI任务 ---- 掌握成熟、标准的任务解决方法掌握AI工具 ---- 完成…

2022 年中高职组“网络安全”赛项-海南省省竞赛任务书-1-B模块-B-4Web渗透测试

前言 本章节我将尝试操作B-4模块的渗透测试&#xff0c;搭建环境很难&#xff0c;还望大家点点赞多多支持&#xff01; 任务概览 最后4、5、6有一定的难度。 环境要求 kali Linux192.168.41.2Web服务器&#xff08;假设为PYsystem 2020 模拟平台&#xff09;192.168.41.7交换…

postman接口测试实战篇

击杀小游戏接口测试 接口测试简单介绍击杀小游戏代码下载单接口测试(postman)接口关联并参数化接口测试简单介绍 首先思考两个问题:1.接口是什么?2.接口测试是什么? 1.我们总是把接口想的很复杂,其实呢,它就是一个有特定输入和输出参数的交互逻辑处理单元,它不需要知…

【实战】Spring Cloud Stream3.0 整合RocketMq

文章目录 前言技术积累Spring Cloud Stream3.0新特性RocketMq简介 实战演示引入Maven依赖增加application配置消息生产者消息消费者 前言 相信很多同学用使用过rocketmq消息中间件&#xff0c;且大多情况下是使用原生的rocketmq-spring-boot-starter 进行集成然后创建一个rock…

Three 三维矩阵(Matrix3)、四维矩阵(Matrix4)

三维矩阵&#xff08;Matrix3&#xff09; var matrix3 new THREE.Matrix3().set( 1,2,3,4,5,6,7,8,9); //而其内部elements则展示为&#xff1a; matrix3.elements [1,4,7,2,5,8,3,6,9]; 属性&#xff08;Properties&#xff09; # .elements : Array 矩阵列优先column-…

Spring中Bean的循环依赖

目录 定义&#xff1a; 循环依赖的后果&#xff1a; 一&#xff1a;三级缓存 1、大概的思路&#xff1a; 注意&#xff1a; 2、执行过程&#xff1a; A半完成&#xff1a; B完成&#xff1a; A完成&#xff1a; 注&#xff1a; 二&#xff1a;Lazy 定义&#xff1a; …

入门C语言只需一个星期(星期三)

点击上方"蓝字"关注我们 01、基本数据类型 char 1 字节 −128 ~ 127 单个字符/字母/数字/ASCIIsigned char 1 字节 −128 ~ 127 -unsigned char 1 字节 0 ~ 255 -int…

Vue数组操作之sort详解

在 Vue.js 中&#xff0c;sort() 方法用于对数组进行排序。它会改变原数组&#xff0c;并返回排序后的数组。默认情况下&#xff0c;sort() 方法按照字母顺序&#xff08;Unicode 编码顺序&#xff09;对数组中的元素进行排序。如果需要按照其他规则排序&#xff0c;可以传递一…

【SpringCloud】微服务远程调用OpenFeign

工作原理流程图 上代码 common中添加依赖&#xff1a; <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency><groupId>org.spri…

CV13_混淆矩阵、F1分数和ROC曲线

1.1 混淆矩阵Confusion Matrix 混淆矩阵&#xff08;Confusion Matrix&#xff09;是机器学习和统计学中用于描述监督学习算法性能的特定表格布局。它是一种特定类型的误差矩阵&#xff0c;可以非常直观地表示分类模型在测试数据集上的预测结果与实际结果之间的对比。 混淆矩…

【数据结构】初识集合框架

&#x1f387;&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳&#xff0c;欢迎大佬指点&#xff01; 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友…

Python爬虫(6) --深层爬取

深层爬取 在前面几篇的内容中&#xff0c;我们都是爬取网页表面的信息&#xff0c;这次我们通过表层内容&#xff0c;深度爬取内部数据。 接着按照之前的步骤&#xff0c;我们先访问表层页面&#xff1a; 指定url发送请求获取你想要的数据数据解析 我们试着将以下豆瓣读书页…

Mysql (五)

create table info ( id int primary key, name varchar(10), score decimal(5,2), address varchar(20), hobbid int(5)); SELECT * FROM info; 排序语法&#xff1a;关键字排序 升序ASC 降序DESC 默认排序方式 升序 配合order by语法使用 SELECT * FROM info ORDER BY…

河南萌新联赛2024第(二)场:南阳理工学院

A 国际旅行Ⅰ D A*BBBB F 水灵灵的小学弟 H 狼狼的备忘录 I 重生之zbk要拿回属于他的一切 J 这是签到 ##A 国际旅行Ⅰ 链接&#xff1a;https://ac.nowcoder.com/acm/contest/87255/A 来源&#xff1a;牛客网 题目描述 很久很久以前&#xff0c;有 n n n 个国家&#xff0c;第…

【ffmpeg命令入门】一篇学会ffmpeg音频选项

文章目录 前言设置音频帧使用方法基本用法 示例示例1&#xff1a;提取前200帧音频示例2&#xff1a;结合其他选项使用 注意事项 设置音频采样率基本用法 示例示例1&#xff1a;调整采样率为48000 Hz示例2&#xff1a;降低采样率为22050 Hz示例3&#xff1a;转换视频文件中的音频…

首发!中科融合3D相机点云转halcon点云 C++代码

中科融合是国内第一家专注于“AI+3D”芯片技术的科技创新型企业。‌拥有完全自主研发的MEMS感知芯片和新一代低功耗AI芯片,‌致力于在5G时代推动具有边缘智能的3D感知设备的发展,‌从而促进智能3D产业链的爆发。‌中科融合的MEMS激光投射模组具有较大的视野和景深,‌以及较强…

字符的统计——423、657、551、696、467、535

423. 从英文中重建数字 最初思路 首先要有一个指针&#xff0c;对于3/4/5为一组地跳跃。起初想的是后瞻性&#xff0c;如果符合0-9任意&#xff0c;则更换index、跳跃。此时写了一个函数&#xff0c;用来判断s的截取段和0-9中有无符合。这个思路并没有进行下去&#xff0c;虽然…

昇思25天学习打卡营第九天|本地安装mindspore之一|Linux的系统在vmware上的安装以及mindspore的安装

课程已经学完了&#xff0c;打算再深入一些。初步的想法是&#xff0c;在本地安装&#xff0c;本地执行。 根据老师的指引&#xff0c;MindSpore官网&#xff0c;“https ://www.mindspore.cn/install/”&#xff0c;注意&#xff0c;因为csdn博客编辑器的原因&#xff0c;当我…