【LeetCode】每日一题 2024_9_27 每种字符至少取 K 个(双指针)

前言

每天和你一起刷 LeetCode 每日一题~

LeetCode 启动!

题目:每种字符至少取 K 个

代码与解题思路

go 复制代码
func takeCharacters(s string, k int) int {
    // 核心思路:
    // 题目要求字符串 s 中,每种字符都取至少 k 个
    // 而且可以从头取,也可以从尾巴取,找出取的时间最短的方法
    // 不妨试着先从尾巴开始取,直到达成题目的要求(达不成就直接返回 -1 即可)
    // 然后再从头开始取,用滑动窗口的思想,找出:"需要的 最少 分钟数"(最优情况)

    n := len(s)
    // 由字符 'a'、'b'、'c' 组成的字符串 s,所以 cnt 只用记录者三种字符即可
    cnt, l := [3]int{}, n
    for cnt[0] < k || cnt[1] < k || cnt[2] < k {
        if l == 0 { // 达不成要求,直接返回 -1
            return -1
        }
        l--
        cnt[s[l]-'a']++
    }
    
    ans := n-l // 目前需要的分钟数
    // 滑动窗口,或者说双指针
    for r := range s { // 维护 cnt 数组中这三个字符的数量,更新子串的最小值
        cnt[s[r]-'a']++
        for l < n && cnt[s[l]-'a'] > k {
            cnt[s[l]-'a']--
            l++
        }
        ans = min(ans, n-l + r+1) // 头的长度 + 尾的长度
    }
    return ans
}

今天这道题目比较难想,是力扣之前的一道周赛题,我曾经做过,所以才有思路,如果第一次做大概也做不太出来

核心思路如注释

这道题的难点就在于,题目要求子串的最小值,但是可以从字符串的头开始,也可以从尾开始,两头加在一起的最小值,怎么样才能判断出来呢?

下次遇到这种类型的题目就知道该怎么操作了,既然头尾都可以,那就先全用尾巴的子串,然后再起一个循环,遍历头部的子串来维护整体长度的最小值


题外话

最近在刷字节青训营给的题目,据说这些题目都是字节曾经出过的笔试面试的真题,到时候我做出一定成果了就来分享一下~

视频实况

【【LeetCode】每日一题 2024_9_27 每种字符至少取 K 个(双指针)】

每天进步一点点

可以和我刷一辈子的每日一题吗?

一题一题,积累起来就是一辈子。

相关推荐
wfeqhfxz258878233 分钟前
YOLO13-C3k2-GhostDynamicConv烟雾检测算法实现与优化
人工智能·算法·计算机视觉
芝士爱知识a1 小时前
2026年AI面试软件推荐
人工智能·面试·职场和发展·大模型·ai教育·考公·智蛙面试
Aaron15881 小时前
基于RFSOC的数字射频存储技术应用分析
c语言·人工智能·驱动开发·算法·fpga开发·硬件工程·信号处理
石去皿2 小时前
大模型面试通关指南:28道高频考题深度解析与实战要点
人工智能·python·面试·职场和发展
程序员辣条2 小时前
AI产品经理:2024年职场发展的新机遇
人工智能·学习·职场和发展·产品经理·大模型学习·大模型入门·大模型教程
AI大模型测试2 小时前
大龄程序员想转行到AI大模型,好转吗?
人工智能·深度学习·机器学习·ai·语言模型·职场和发展·大模型
美团程序员2 小时前
80道经典常见测试面试题
软件测试·面试·职场和发展·软件测试面试
sunguang20182 小时前
“懂不懂管理,一看便知”:做管理就是3件事,抓大、放小、管细做管理,其实就是要做好三件事:抓大、放小、管细。
经验分享·职场和发展
ProcessOn官方账号2 小时前
程序员如何与同龄人拉开差距?这5张让你快速提升认知,打开格局!
深度学习·职场和发展·学习方法
阿福赚美刀2 小时前
跨境电商公司如何高效培养新人:实战经验分享
职场和发展·电脑