678. 有效的括号字符串|刷题打卡

简介: 给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串

一、题目描述:


给定一个只包含三种字符的字符串:()*,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:

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


示例 1:

输入:s = ()

输出:true


示例 2:

输入:s = (*)

输出:true


示例 3:

输入:s = (*))

输出:true


提示:

字符串大小将在 [1,100] 范围内


二、思路分析:


题目在20的基础上增加了一点变化,引入*,可以代替()或空。


步骤一:


我们可以引入两个栈stack和star,分别保存(*,通过遍历字符串,将)与两个栈的相匹配。

  • stack栈有,先匹配stack栈,stack存在,就pop()即可;
  • stack栈无,就匹配star,star执行pop();
  • 两者均无,直接返回false。


例子1:


s = (*))

网络异常,图片无法展示
|

网络异常,图片无法展示
|


最后,stack栈length为0,说明符合匹配要求。

步骤二:


匹配多余(。字符串遍历完,可能出现stack和star栈存在长度。

此时,我们就还需要对匹配之后的stack和star进行判断。我们可以将不符合情况的找出来,最后符合的就直接返回true。不符合的:

  • star长度小于star,说明*不够去填补(,直接不符合情况;
  • star长度大于等于stack:说明大体可以满足(配对。
  • 特殊情况:*(,此时我们应该调整方法,将s中的下标分配到两个栈中。在此情况下,判断两个栈顶元素值,当star.pop() < stack.pop()时是不符合条件的。


例子2:


s = (*())(*((**()

经过步骤一匹配后,stack与star均存在长度不为零的情况,并且star长度大于stack。

网络异常,图片无法展示
|
此时,需要判断各自栈顶元素值。在两个栈都存在的情况下循环,两栈的栈顶相比较, star.pop() < stack.pop()时直接返回false。stack长度为空时停止循环。

网络异常,图片无法展示
|

网络异常,图片无法展示
|


三、AC 代码:


function checkValidString(s: string): boolean {
    let stack = [];
    let star = [];
    for (let i = 0; i < s.length; i++) {
        switch (s[i]) {
            case "(":
                stack.push(i);
                break;
            case "*":
                star.push(i);
                break;
            case ")":
                if (stack.length) {
                    stack.pop();
                } else if (star.length) {
                    star.pop();
                } else {
                    return false;
                }
                break;
        }
    }
    if (star.length >= stack.length) {
        while (star.length && stack.length) {
            if (star.pop() < stack.pop()) return false;
        }
    } else {
        return false;
    }
    return true;
};


四、总结:


在上一题的基础上进行扩展,同样是使用栈来分别保存(*,然后进行匹配,主要是需要找到两个栈和s的关系,还需要考虑特殊情况的存在。


作者:ClyingDeng

链接:https://juejin.cn/post/6948293876889157662

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

目录
相关文章
|
机器学习/深度学习 人工智能 UED
为何NPU是开启终端侧生成式AI的关键?
【2月更文挑战第17天】为何NPU是开启终端侧生成式AI的关键?
335 2
为何NPU是开启终端侧生成式AI的关键?
|
机器学习/深度学习 数据采集 搜索推荐
多模型DCA曲线:如何展现和解读乳腺癌风险评估模型的多样性和鲁棒性?
多模型DCA曲线:如何展现和解读乳腺癌风险评估模型的多样性和鲁棒性?
474 1
|
监控 Linux
在Linux中,如何进行系统性能瓶颈分析?
在Linux中,如何进行系统性能瓶颈分析?
|
9月前
|
安全 Android开发 数据安全/隐私保护
Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
404 12
Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
|
12月前
|
人工智能 并行计算 PyTorch
ViewExtrapolator:南洋理工联合UCAS团队推出的新型视图合成方法
南洋理工大学与UCAS团队联合推出了一种新型视图合成方法——ViewExtrapolator。该方法基于稳定视频扩散(SVD)技术,能够在不进行微调的情况下,高效生成超出训练视图范围的新视角图像,显著减少伪影,提升视觉质量。ViewExtrapolator具有广泛的应用前景,尤其在虚拟现实、3D内容创建、电影制作等领域。
179 1
ViewExtrapolator:南洋理工联合UCAS团队推出的新型视图合成方法
|
机器学习/深度学习 算法 计算机视觉
【python】计算机视觉~舌象图片中舌体倾斜判别(四)
【python】计算机视觉~舌象图片中舌体倾斜判别(四)
385 0
|
数据采集 前端开发 测试技术
Selenium中定位元素的9种方法
在Selenium中,定位页面元素是自动化测试和网页爬虫的基础。常用的9种元素定位方法包括:ID、Name、Class Name、Tag Name、CSS Selector、XPath、Link Text、Partial Link Text,以及XPath和CSS选择器的组合使用。每种方法各有优劣,建议根据页面的具体情况和元素的属性选择最合适的方法,并使用显式等待确保元素可用。
1703 5
|
自然语言处理 API 开发工具
初识langchain:LLM大模型+Langchain实战[qwen2.1、GLM-4]+Prompt工程
【7月更文挑战第6天】初识langchain:LLM大模型+Langchain实战[qwen2.1、GLM-4]+Prompt工程
初识langchain:LLM大模型+Langchain实战[qwen2.1、GLM-4]+Prompt工程
|
存储 Python
python基础篇:图解Python字典,一目了然的键值对数据结构!
【4月更文挑战第6天】python基础篇:图解Python字典,一目了然的键值对数据结构!
359 2
python基础篇:图解Python字典,一目了然的键值对数据结构!
|
JSON Rust 监控
公司电脑监控软件的Rust编程实现与安全性提升
这篇文章介绍了如何使用Rust编程语言开发一个基础的企业电脑监控软件,包括初始化项目、捕获键盘输入、监控网络活动。同时,文章强调了提升安全性的重要性,提出了数据加密(如AES)和完整性校验(如SHA-256)的方法,并展示了如何将监控数据自动提交到远程服务器。通过Rust,开发者能创建高效且安全的监控解决方案。
527 2