力扣题解2516

news/2024/11/17 19:28:26/

大家好,欢迎来到无限大的频道

今天继续给大家带来每日一题

题目描述(中等):

每种字符至少取k个
给你一个由字符 ‘a’、‘b’、‘c’ 组成的字符串 s 和一个非负整数 k 。每分钟,你可以选择取走 s 最左侧 还是 最右侧 的那个字符。

你必须取走每种字符 至少 k 个,返回需要的 最少 分钟数;如果无法取到,则返回 -1 。

在这里插入图片描述

题目分析

题目给定一个由字符 ‘a’, ‘b’, ‘c’ 组成的字符串 s 和一个非负整数 k。你需要从字符串的左侧或右侧每次取一个字符,取走每种字符至少 k 个,返回这个操作所需的最少分钟数。如果无法完成操作,则返回 -1

解题思路

  1. 需求分析

    • 要求我们至少取走 k 个 ‘a’、‘k’ 个 ‘b’、‘k’ 个 ‘c’。
    • 直接从字符串的两端取字符,需要在保证符合条件的前提下,尽量减少取走的总字符数。
  2. 预检查

    • 首先遍历字符串,统计各个字符的总数量。
    • 如果任何一种字符的数量小于 k,则直接返回 -1,因为不可能完成任务。
  3. 滑动窗口

    • 既然必须从两端取字符,我们可以尝试计算从一端取出所有字符的最小代价。
    • 使用双指针技巧构建一个滑动窗口,每次移动两个指针来记录两个端点的位置。
    • 每当右端点 r 多取一个字符时,减少该字符的需求量 cnt。若不足 k,通过移动左端点 l来补充字符,直到满足每种字符的需求量。
  4. 结果计算

    • 滑动窗口的右指针遍历完整个字符串的过程,可以计算出满足需求情况下,最少需要保留的字符串长度,即 len - (r - l + 1)
    • 在满足需求的条件下,记录保留字串的最小长度,我们的答案是在字符串 len 中取出剩余部分所需的最少字符数,即 len - (r - l + 1)

算法设计

  1. 初始化字符计数数组 cnt[3]
  2. 统计字符串中各个字母的总数量。
  3. 判断是否有无法完成的字符种类,直接返回 -1
  4. 使用双指针方法:
    • 初始状态下,双指针指向左端 l = 0,同时 r 从头开始遍历。
    • 对于每个右端 r,减少该字符的需求量。
    • 当某种字符需求量不足时,移动左端 l 补充字符需求。
    • 在满足条件的时候,更新答案为 ans = min(ans, len - (r - l + 1))
  5. 返回计算出的最小值。

参考代码如下

int takeCharacters(char* s, int k) {int cnt[3] = {0};int len = strlen(s);int ans = len;for (int i = 0; i < len; i++) {cnt[s[i] - 'a']++;}if (cnt[0] >= k && cnt[1] >= k && cnt[2] >= k) {ans = len;} else {return -1;}for (int l = 0, r = 0; r < len; r++) {cnt[s[r] - 'a']--;while (l < r && (cnt[0] < k || cnt[1] < k || cnt[2] < k)) {cnt[s[l] - 'a']++;l++;}if (cnt[0] >= k && cnt[1] >= k && cnt[2] >= k) {ans = fmin(ans, len - (r - l + 1));}}return ans;
}

时间复杂度分析

  • 初始化计数和预检查:需要遍历一遍字符串,复杂度为 ( O(n) )。
  • 滑动窗口的操作:最坏情况下,lr 各遍历一次字符串,时间复杂度是 ( O(n) )。
  • 总时间复杂度:综上,算法的总时间复杂度为 ( O(n) )。

空间复杂度分析

  • 仅使用了固定数量的额外空间(字符计数数组 cnt[3]),所以空间复杂度为 ( O(1) )。

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

相关文章

DAY80服务攻防-中间件安全HW2023-WPS 分析WeblogicJettyJenkinsCVE

知识点 1、中间件-Jetty-CVE&信息泄漏 2、中间件-Jenkins-CVE&RCE执行 3、中间件-Weblogic-CVE&反序列化&RCE 4、应用WPS-HW2023-RCE&复现&上线CS 中间件-Jetty-CVE&信息泄漏 Jetty是一个开源的servlet容器&#xff0c;它为基于Java的Web容器…

vscode 的terminal 输出打印行数限制设置

修改 VSCODE 的 settings.json文件 "terminal.integrated.scrollback": 100000, {"extensions.ignoreRecommendations": true,"workbench.colorTheme": "Monokai","explorer.confirmDelete": false,"editor.fontSize…

自动化测试实例:Web登录功能性测试(无验证码)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是自动化测试 把人为驱动的测试行为转化为机器执行的一种过程称为自动化测试。(来自百度百科)本质上来说&#xff0c;自动化测试对比起手工测试除了需要…

Linux云计算 |【第四阶段】PROJECT2-DAY2

综合项目内容&#xff1a; 升级网站运行平台、部署Redis内存存储服务集群、数据迁移、部署PXCMySQL实现强同步、部署LB和HA集群 一、项目拓扑结构 PROJECT2-DAY1回顾&#xff1a; 服务架构缺点分析&#xff1a; ① 数据存储结构存在单点故障&#xff08;需增调度器&#xff0…

Harbor使用

文章目录 1、上传镜像1.1、在Harbor上创建一个项目1.2、docker添加安全访问权限1.3、推送docker镜像到该项目中1.3.1、登录到Harbor1.3.2、给镜像重新打一个标签1.3.3、推送镜像到Harbor中 2、拉取镜像2.1、先删掉原来的镜像2.2、执行拉取命令 1、上传镜像 需求&#xff1a;将…

Service nxpnfc_hal_svc

类似service启动 主要分为两部分 service nxpnfc_hal_svc /vendor/bin/hw/vendor.nxp.nxpnfc1.0-serviceclass haluser nfcgroup nfc 1.nxpnfc_hal_svc&#xff0c;这个一般是权限te device/rockchip/common/sepolicy/nxp_nfc_server.te type nfc_vendor_data_file, file_t…

frp内网穿透服务器+客户端详细配置

当我们拥有一台云服务器时&#xff0c;可以将局域网服务器的服务通过内网穿透发布到公网上。frp是一个主流的内网穿透软件&#xff0c;本文讲解frp内网穿透服务器客户端详细配置。 一、需要准备的内容&#xff1a; 腾讯云服务器&#xff1a;https://curl.qcloud.com/Sjy0zKjy 2…

Linux如何通过链接下载文件

在Linux系统中&#xff0c;你可以通过多种方式通过链接下载文件。这些方式包括使用命令行工具&#xff08;如wget、curl、axel等&#xff09;和图形界面程序&#xff08;如浏览器或文件管理器&#xff09;。以下是几种常用的命令行方法&#xff1a; 1. 使用wget wget是一个非交…