当前位置: 首页 > news >正文

【C++前后缀分解】1653. 使字符串平衡的最少删除次数|1793

前后缀分解

C++前后缀分解

LeetCode1653. 使字符串平衡的最少删除次数

给你一个字符串 s ,它仅包含字符 ‘a’ 和 'b’​​​​ 。
你可以删除 s 中任意数目的字符,使得 s 平衡 。当不存在下标对 (i,j) 满足 i < j ,且 s[i] = ‘b’ 的同时 s[j]= ‘a’ ,此时认为 s 是 平衡 的。
请你返回使 s 平衡 的 最少 删除次数。
示例 1:
输入:s = “aababbab”
输出:2
解释:你可以选择以下任意一种方案:
下标从 0 开始,删除第 2 和第 6 个字符(“aababbab” -> “aaabbb”),
下标从 0 开始,删除第 3 和第 6 个字符(“aababbab” -> “aabbbb”)。
示例 2:
输入:s = “bbaaaaabb”
输出:2
解释:唯一的最优解是删除最前面两个字符。
提示:
1 <= s.length <= 105
s[i] 要么是 ‘a’ 要么是 'b’​ 。​

前后缀分解

n = s.lenght
我们假定s同时存在a和b,最后一个a的下标为1,第一个b的下标为i+1。
则解为:s长度为i+1的前缀中b的数量,n-(i+1)的后缀中a的数量。
枚举s长度为i的前缀b的数量n1,长度为n-i的后缀中a的数量n2。n1+n2的最小值就是解。
全部是a或b,也符合,故无需特殊处理。i ∈ \in [0,n]。
后缀的a的数等于s的转置字符串s1的前缀中a的数量。

代码

打开打包代码的方法兼述单元测试

核心代码

class Solution {public:int minimumDeletions(string s) {m_iN = s.length();auto Cnt = [&](const string& s,  char chCnt) {vector<int> ret(1);for (const auto& ch : s ) {ret.emplace_back(ret.back() + (ch == chCnt));}return ret;};auto left = Cnt(s, 'b');auto right = Cnt(string(s.rbegin(), s.rend()), 'a');int ret = INT_MAX;for (int i = 0; i <= m_iN; i++) {ret = min(ret, left[i] + right[m_iN - i]);}return ret;}int m_iN;};

单元测试

	string s ;TEST_METHOD(TestMethod1){s = "baaaa";auto res = Solution().minimumDeletions(s);AssertEx(1, res);}TEST_METHOD(TestMethod2){s = "bbbba";auto res = Solution().minimumDeletions(s);AssertEx(1, res);}TEST_METHOD(TestMethod3){s = "ab";auto res = Solution().minimumDeletions(s);AssertEx(0, res);}TEST_METHOD(TestMethod11){s = "aababbab";auto res = Solution().minimumDeletions(s);AssertEx(2, res);}TEST_METHOD(TestMethod12){s = "bbaaaaabb";auto res = Solution().minimumDeletions(s);AssertEx(2, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。


http://www.mrgr.cn/news/28801.html

相关文章:

  • 开源音乐分离器Audio Decomposition:可实现盲源音频分离,无需外部乐器分离库,从头开始制作。将音乐转换为五线谱的程序
  • FFMPEG录屏(22)--- Linux 下基于X11枚举所有显示屏,并获取大小和截图等信息
  • 【GPT使用技巧】用AI出一门课
  • 3216. 交换后字典序最小的字符串
  • 华为私有接口类型hybrid
  • leetcode-15-三数之和
  • DFS:二叉树中的深搜
  • Qt_输入类控件
  • 破损shp文件修复
  • 代码随想录算法训练营第57天|卡码网 53. 寻宝 prim算法精讲和kruskal算法精讲
  • 中位数贪心+分组,CF 433C - Ryouko‘s Memory Note
  • C++基于select和epoll的TCP服务器
  • 问题——IMX6UL的uboot无法ping主机或Ubuntu
  • 基于形状记忆聚合物的折纸超结构
  • 速通LLaMA2:《Llama 2: Open Foundation and Fine-Tuned Chat Models》全文解读
  • 【Elasticsearch系列九】控制台实战
  • 视频工具EasyDarwin将本地视频生成RTSP给WVP拉流列表
  • 螺丝、螺母、垫片等紧固件常用类型详细介绍
  • 【HTML】HTML页面和常见标签
  • NixOS 24.5安装 flake
  • Maven入门学习
  • 【MySQL】MySQL中JDBC编程——MySQL驱动包安装——(超详解)
  • 系统架构-面向对象
  • 富文本编辑器wangEdittor使用入门
  • DFS:深搜+回溯+剪枝实战解决OJ问题
  • 通信工程学习:什么是EPON以太网无源光网络