【leetcode】替换后的最长重复字符、将字符串翻转到单调递增

news/2024/12/12 1:57:51/

1.替换后的最长重复字符

示例如下:

 

下面我们来分析一下一个例子,其中K = 2

暴力枚举

这里的字符串s是仅由大写字母组成,首先我们尝试用暴力解法的思路来想一下这道题,通过从第一个字符开始进行枚举,如果出现了条件判断不成立,也就是说,需要替换的字符数量已经超过了K个,因此对于本次枚举的字符串再往后的字符就不可能是重复的字符串了,因此在从下一个字符进行枚举。

接下来继续从下一个字符开始枚举:

知道字符串s的末尾,然后在进行找最大重复子串的同时用一个变量记录最大长度即可,这就是暴力枚举。

滑动窗口

如果back走到上图的位置,那么此时已经无法满足替换K个窗口里的字符是该字符串是重复字符了,此时如果继续让back往后走,那么接下来的子串就不可能是重复字符的子串了,因此我们要移动prev:

然后此时窗口内的字符就满足重复字符的子串了,然后继续先后移动back

因此使用滑动窗口的关键是要进行判断:窗口中的子串是否可以不超过K次替换后是重复字符子串。

class Solution {
public:int characterReplacement(string s, int k) {//开辟一个数组,存储窗口中不同类字符出现的次数vector<int> v(26);int prev = 0,back = 0;int max_count = 0;int res = 0;while(back < s.length()){//进窗口v[s[back]-'A']++;//vector<int> v_copy(v);//std::sort(v_copy.begin(),v_copy.end(),std::greater<int>());//max_count = v_copy[0];max_count = *std::max_element(v.begin(),v.end());//判断while(back-prev+1-max_count > k){//出窗口v[s[prev]-'A']--;++prev;}//更新结果res = std::max(res,back-prev+1);++back;}return res;}
};

2.将字符串翻转到单调递增

示例:

 动态规划

下面我们来分析一个示例:

 

通过上面例子的逐个位置分析可以理解到,最小翻转次数就是min(某个位置的前面的1的个数+位置后的0的个数),因此我们可以定义两个数组:dp1,dp0,分别表示某个位置前1的个数,位置后0的个数。

class Solution {
public:int minFlipsMonoIncr(string s) {//s中1的前缀和,0的后缀和vector<int> dp0(s.size());vector<int> dp1(dp0);int res = INT_MAX;for(int i = 1,j = s.size()-2;i<s.size();++i,--j){//1的前缀和if('1' == s[i-1])dp1[i] = dp1[i-1]+1;elsedp1[i] = dp1[i-1];//0的后缀和if('0' == s[j+1])dp0[j] = dp0[j+1]+1;elsedp0[j] = dp0[j+1];}for(int i = 0;i<dp0.size();++i)res = std::min(res,dp0[i]+dp1[i]);return INT_MAX == res ? 0 : res;}
};


http://www.ppmy.cn/news/1554370.html

相关文章

Promise详解-1:初识Promise

最近在回顾ES6的知识&#xff0c;想整理下跟Promise相关的内容。我准备整一个Promise解读的系列&#xff0c;看看能深入到什么程度吧。由浅入深&#xff0c;先认识下Promise。 痛苦的回忆&#xff1a;回调地狱 假如现在让你维护一个“古老”的项目&#xff0c;缺少脚手架的加…

Spring Boot 3.4.0 发布:功能概览与示例

Spring Boot 3.4.0 带来了许多增强功能&#xff0c;使现代应用开发更加高效、便捷和强大。以下是最新功能的完整概述&#xff0c;以及一些帮助您快速入门的代码示例。 1. 应用程序版本管理 Spring Boot 引入了 spring.application.version 属性&#xff0c;方便开发者设置和访…

Android CoordinatorLayout:打造高效交互界面的利器

目录 一、CoordinatorLayout 介绍及特点 二、使用方法 2.1 创建 CoordinatorLayout 布局 2.2 添加需要协调的子视图 2.3 自定义 Behavior 三、结语 相关推荐 在Android开发中&#xff0c;面对复杂多变的用户界面需求&#xff0c;CoordinatorLayout以其强大的交互管理能力…

Android13应用在后台录音无声音

最近在做项目&#xff0c;对讲应用放在后台&#xff0c;录音无声音&#xff0c;最后解决。 一 现象 对讲应用运行在后台&#xff0c;录音无效查看日志&#xff0c;AudioRecorder录音回调全是0&#xff1b;状态栏无通知&#xff0c;无申请通知权限。 二解决 看了现象应该能够…

Open AI 推出 ChatGPT Pro

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

ensp实验-vrrp多网关配置

一、交换机与路由的配置区别 1. 角色定义交换机&#xff1a; Master 或 Backup: 交换机通常作为 Master 或 Backup 设备参与 VRRP&#xff0c;负责在主设备故障时接替其工作。路由器&#xff1a; Master 或 Backup: 路由器同样可以作为 Master 或 Backup 设备…

Paddle Inference部署推理(二十四)

二十四&#xff1a;Paddle Inference推理 &#xff08;C&#xff09;API详解 9. 启用内存优化 API定义如下&#xff1a; // 开启内存/显存复用&#xff0c;具体降低内存效果取决于模型结构 // 参数&#xff1a;None // 返回&#xff1a;None void EnableMemoryOptim();// 判…

现代C++16 pair

文章目录 1. **概述**2. **成员类型和成员对象**3. **构造函数**4. **成员函数**5. **非成员函数**5.1 **make_pair**5.2 **比较运算符**5.3 **std::swap**5.4 **std::get** 6. **辅助类**6.1 **std::tuple_size 和 std::tuple_element**6.2 **std::common_type 和 std::basic_…