每日一练 2024.6.7

        给你一个仅由 大写 英文字符组成的字符串 s 。

        你可以对此字符串执行一些操作,在每一步操作中,你可以从 s 中删除 任一个 "AB" 或 "CD" 子字符串。

        通过执行操作,删除所有 "AB" 和 "CD" 子串,返回可获得的最终字符串的 最小 可能长度。

注意,删除子串后,重新连接出的字符串可能会产生新的 "AB" 或 "CD" 子串。

示例 1:

输入:s = "ABFCACDB"
输出:2
解释:你可以执行下述操作:
- 从 "ABFCACDB" 中删除子串 "AB",得到 s = "FCACDB" 。
- 从 "FCACDB" 中删除子串 "CD",得到 s = "FCAB" 。
- 从 "FCAB" 中删除子串 "AB",得到 s = "FC" 。
最终字符串的长度为 2 。
可以证明 2 是可获得的最小长度。

示例 2:

输入:s = "ACBBD"
输出:5
解释:无法执行操作,字符串长度不变。

提示:

  • 1 <= s.length <= 100
  • s 仅由大写英文字母组成

分析

        题目要求通过删除任意一个 "AB" 或 "CD" 子字符串,得到最后最短可能的字符串长度。由于被删除的子字符串是固定的,因此每次只需要检查当前字符串中是否存在这些子字符串,并且如果存在就删除。我们可以通过利用栈这种数据结构实现这个过程,栈在处理相邻字符匹配的情况下非常高效,因为栈是后进先出 (LIFO) 的数据结构。

详细分析步骤:

  1. 初始化栈

    • 使用一个空栈来存放字符。
  2. 遍历字符串

    • 遍历字符串 s 中的每一个字符。
  3. 检查相邻字符

    • 在遍历时,检查栈顶字符和当前遍历字符是否可以组成 "AB" 或 "CD" 子字符串。
      • 如果栈顶字符与当前字符能组成 "AB" 或 "CD",说明这些字符可以被删除。
      • 使用 stack.pop() 处理这种情况,即删除栈顶字符,相当于删除子串中的其中一个字符,当前字符也就被忽略。
      • 如果不能组成 "AB" 或 "CD",则将当前字符放入栈中。
  4. 计算最终结果

    • 遍历结束,栈中剩余的字符即是无法再被删除的字符。
    • 栈中字符的数量就是最终的字符串长度。

流程图

开始
↓
初始化一个空栈
↓
遍历字符串中的每一个字符
↓
检查栈顶字符和当前字符是否可以形成 "AB" 或 "CD"
↓
是 ——> 弹出栈顶字符
↓
否 ——> 将当前字符入栈
↓
遍历结束
↓
栈中剩余字符的数量即为最终字符串的最小长度
↓
结束

代码讲解

class Solution {
    public int minLength(String s) {
        // 创建一个栈来存放字符
        Stack<Character> stack = new Stack<>();
        
        // 遍历字符串中的每一个字符
        for (char c : s.toCharArray()) {
            // 检查栈顶字符和当前字符是否可以形成 "AB" 或 "CD"
            if (!stack.isEmpty() && 
                ((stack.peek() == 'A' && c == 'B') || (stack.peek() == 'C' && c == 'D'))) {
                stack.pop(); // 如果是,则移除栈顶字符
            } else {
                stack.push(c); // 否则,将当前字符入栈
            }
        }
        
        // 栈中的剩余字符数量即为最终字符串的最小可能长度
        return stack.size();
    }
}
讲解
  • 初始化栈
   Stack<Character> stack = new Stack<>();
  • 创建一个空的栈对象,用于存放字符。
  • 遍历字符串
   for (char c : s.toCharArray()) {
  • 使用增强 for 循环将字符串 s 转成字符数组并逐个遍历字符。
  • 检查相邻字符
   if (!stack.isEmpty() && 
       ((stack.peek() == 'A' && c == 'B') || (stack.peek() == 'C' && c == 'D'))) {
       stack.pop();
   } else {
       stack.push(c);
   }
  • 使用 !stack.isEmpty() 检查栈是否非空。
  • 使用 stack.peek() 获取栈顶字符,并检查当前字符 c 和栈顶字符是否匹配可构成 "AB" 或 "CD" 对。
    • 如果匹配:
       stack.pop();

删除栈顶字符,因为构成了 "AB" 或 "CD"。

  • 如果不匹配:
       stack.push(c);

将当前字符加入栈中。

  • 计算结果
   return stack.size();
  • 遍历结束后,栈中剩下的字符数量即为最终字符串的最小可能长度。

知识点解析

  • 栈 (Stack):

    • 栈是一种后进先出 (LIFO: Last In, First Out) 的数据结构。在这里,我们利用栈的这一特性来匹配相邻的字符,方便地处理 "AB" 和 "CD" 子串的删除操作。
  • 字符串遍历

    • 代码中的 for (char c : s.toCharArray()) 是一种常见的逐字符遍历字符串的方法。
  • 条件判断

    • 利用条件判断 if (!stack.isEmpty() && ((stack.peek() == 'A' && c == 'B') || (stack.peek() == 'C' && c == 'D'))),我们可以高效地匹配和删除满足条件的子串。
知识点详细解释
栈 (Stack)一种后进先出 (LIFO) 的数据结构,支持 pushpoppeek, 和 isEmpty 等操作。
遍历字符串toCharArray() 方法将字符串转换成字符数组,可以使用增强 for 循环来逐字遍历。
条件判断使用 if 语句结合 && 和 `
算法思想利用栈的性质处理相邻字符的匹配与删除问题,避免繁琐和低效的字符串替换操作,保持高效性。

2024.6.7

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【面试八股总结】死锁:产生条件、预防死锁、处理死锁、避免死锁

一、什么是死锁&#xff1f; 死锁是指两个&#xff08;或多个&#xff09;线程互相等待对方数据的过程&#xff0c;死锁的产生导致程序卡死&#xff0c;不解锁程序将永远⽆法进⾏下 去 二、死锁产生条件 死锁只有同时满足以下四个条件才会发生&#xff1a;互斥条件&#xff1b…

笔记-2024视频会议软件技术选型方案

一、背景 视频会议系统是一种现代化的办公系统&#xff0c;它可以使不同会场的实时现场场景和语音互连起来&#xff0c;同时向与会者提供分享听觉和视觉的空间&#xff0c;使各与会方有“面对面”交谈的感觉。随着社会的发展&#xff0c;视频会议的应用越来越广泛&#xff0c;…

【数据分析基础】实验四 matplotlib数据可视化处理

一&#xff0e;实验目的 掌握扩展库matplotlib及其依赖库的安装。了解matplotlib的绘图一般过程。熟练掌握折线图、散点图、柱状图、饼状图、雷达图的绘制与常用属性的设置。掌握绘图区域的切分、绘制不同子图的方法。熟悉坐标轴、图像标题、图例等对象的属性设置操作。 二、实…

新品!和芯星通全系统全频高精度板卡UB9A0首发

6月6日&#xff0c;和芯星通发布了UB9A0全系统全频高精度GNSS板卡&#xff0c;主要应用于CORS站、便携基站、GNSS全球监测跟踪站等。延续了上一代产品高质量原始观测量的特点&#xff0c;UB9A0在性能和稳定性方面均表现出众。 UB9A0基于射频基带及高精度算法一体化的GNSS SoC芯…

Django 开发也在用 React!

你好&#xff0c;我是坚持分享干货的 EarlGrey&#xff0c;翻译出版过《Python编程无师自通》、《Python并行计算手册》等技术书籍。 如果我的分享对你有帮助&#xff0c;请关注我&#xff0c;一起向上进击。 在前天的推文里&#xff0c;我们分享了《Django 2024 年度报告》&am…

一起学大模型 - 一起动笔练习prompt的用法

文章目录 前言一、代码演示二、代码解析1. 导入所需的库和模块&#xff1a;2. 设置日志记录和初始化模型&#xff1a;3. 定义一个函数用于清理GPU内存&#xff1a;4. 定义一个继承自LLM基类的QianWenChatLLM类&#xff0c;并实现对话生成的逻辑&#xff1a;5. 示例代码的主体部…

柏曼护眼台灯值得入手吗?明基、书客实测对比

早期的台灯主要是以白炽灯为主&#xff0c;但随着LED技术的成熟&#xff0c;LED台灯逐渐成为主流。目前&#xff0c;台灯行业已经进入了一个高速发展的阶段&#xff0c;市场竞争也越来越激烈。如何选购护眼台灯也是大家最常问的问题&#xff0c;柏曼护眼台灯值得入手吗&#xf…

HTML静态网页成品作业(HTML+CSS)—— 电影泰坦尼克号介绍网页(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

2024年G3锅炉水处理证考试题库及G3锅炉水处理试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年G3锅炉水处理证考试题库及G3锅炉水处理试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲随机…

咖啡机器人如何精准控制液位流量

在如今快节奏的生活中&#xff0c;精确控制液位流量的需求愈发迫切&#xff0c;特别是在咖啡机器人等精密设备中。为了满足这一需求&#xff0c;工程师们不断研发出各种先进的技术&#xff0c;以确保液体流量的精准控制。其中&#xff0c;霍尔式流量计和光电式流量计就是两种常…

如何用Postman做接口自动化测试?5个步骤带你轻松实现!

什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已经开发完成的用例还…

基于函数计算部署GPT-Sovits语音生成模型实现AI克隆声音

GPT-Sovits是一个热门的文本生成语音的大模型&#xff0c;只需要少量样本的声音数据源&#xff0c;就可以实现高度相似的仿真效果。通过函数计算部署GPT-Sovits模型&#xff0c;您无需关心GPU服务器维护和环境配置&#xff0c;即可快速部署和体验模型&#xff0c;同时&#xff…

基于ensp的园区网络搭建综合实验

核心技术介绍 1、虚拟局域网&#xff08;VLAN&#xff09; 2、链路聚合&#xff08;E-trunk&#xff09; 3、多生成树协议&#xff08;MSTP&#xff09; 4、VLANIF三层逻辑接口 5、虚拟路由冗余协议&#xff08;VRRP&#xff09; 6、开放式最短路径优先&#xff08;OSPF&…

【C++历练之路】C++11中的列表初始化声明新方法深入标准模板库的变革

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 目录 1. C11简介 2. 统一的列表初始化 2.1 &#xff5b;&#xff5d;初始化 2.2 std::initializer_list 3. 声明 3.1 auto 3.2 decltype 4.STL中一些变化 1. C11简介 在2003年C标准委员会曾经提交了一份技术勘误…

响应式流规范解析

在互联网应用构建过程中&#xff0c;我们知道可以采用异步非阻塞的编程模型来提高服务的响应能力。而为了实现异步非阻塞&#xff0c;我们可以引入数据流&#xff0c;并对数据的流量进行控制。我们来考虑一个场景&#xff0c;如果数据消费的速度跟不上数据发出的速度&#xff0…

腺苷调节合成高密度脂蛋白用于三阴性乳腺癌的化学免疫治疗

引用信息 文 章&#xff1a;Adenosine-modulating synthetic high-density lipoprotein for chemoimmunotherapy of triple-negative breast cancer 期 刊&#xff1a;Journal of Controlled Release&#xff08;影响因子&#xff1a;10.8&#xff09; 发表时间&am…

webgl_effects_stereo

ThreeJS 官方案例学习&#xff08;webgl_effects_stereo&#xff09; 1.效果图 2.源码 <template><div><div id"container"></div></div> </template> <script> import * as THREE from three; // 导入控制器 import { …

【乐吾乐2D可视化组态编辑器】实时数据,数据绑定

什么是绑定变量&#xff1f; 绑定变量是指把图元的一个属性与设备数据点关联的一个过程。【注意】只是建立一个数据模型的关联&#xff0c;数据源后面设置。 乐吾乐2D可视化组态编辑器地址&#xff1a;https://2d.le5le.com/ 为什么不直接设置数据源&#xff1f; 方便批量…

AWS-生产级微服务部署架构分享

使用AWS搭建云上应用 名词解释 AWS ECR&#xff1a;AWS ECR 容器存储库&#xff0c;按项目名创建容器仓库&#xff0c;一个项目对应一个仓库&#xff0c;目前是由Jenkins构建镜像远程push到AWS ECR。 **AWS ECS&#xff1a;Amazon Elastic Container Service (ECS) &#xf…

物理安全防护如何创新强化信息安全体系?

物理安全防护是信息安全体系的重要组成部分&#xff0c;它通过保护实体设施、设备和介质等&#xff0c;防止未授权访问、破坏、盗窃等行为&#xff0c;从而为信息系统提供基础的安全保障。要创新强化信息安全体系中的物理安全防护&#xff0c;可以从以下几个方面着手&#xff1…