首页 > 其他分享 >2516. 每种字符至少取 K 个

2516. 每种字符至少取 K 个

时间:2024-09-29 10:02:00浏览次数:1  
标签:字符 每种 int cnt ++ ans 2516 指针

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

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

示例 1:

输入:s = "aabaaaacaabc", k = 2
输出:8
解释:
从 s 的左侧取三个字符,现在共取到两个字符 'a' 、一个字符 'b' 。
从 s 的右侧取五个字符,现在共取到四个字符 'a' 、两个字符 'b' 和两个字符 'c' 。
共需要 3 + 5 = 8 分钟。
可以证明需要的最少分钟数是 8 。
示例 2:

输入:s = "a", k = 1
输出:-1
解释:无法取到一个字符 'b' 或者 'c',所以返回 -1 。

解题思路:
1.先统计字符出现的次数要大于等于k的值,否则返回-1
代码:
// 计数数组,初始化
int[] cnt = new int[3];
int n = s.length();
int ans = 0;

    // 统计每个字符的出现次数
    for (int i = 0; i < n; i++) {
        cnt[s.charAt(i) - 'a']++;
    }

    // 检查每个字符的计数是否满足小于 k 的条件
    if (cnt[0] < k || cnt[1] < k || cnt[2] < k) {
        return -1; // 如果任一字符的计数小于 k,返回 -1
    }

2.滑动窗口算法,用于找到满足条件的最短子串,并更新结果 ans,找到最短的子串(即可以删除的最大字符长度)

完整代码:
     class Solution {
        public int takeCharacters(String s, int k) {
            // 计数数组,用于统计每个字符的出现次数
            int[] cnt = new int[3];
            // 字符串长度
            int len = s.length();
            // 初始化答案为字符串长度,后续会取最小值
            int ans = len;

            // 遍历字符串,统计每个字符的出现次数
            for (int i = 0; i < len; i++) {
                cnt[s.charAt(i) - 'a']++;
            }

            // 如果任一字符的计数小于k,无法满足条件,返回-1
            if (cnt[0] < k || cnt[1] < k || cnt[2] < k) {
                return -1;
            }

            // 左指针,用于滑动窗口
            int l = 0;
            // 右指针,用于滑动窗口
            for (int r = 0; r < len; r++) {
                // 移除当前字符,因为考虑的是移除字符的情况
                cnt[s.charAt(r) - 'a']--;

                // 当左指针小于右指针,并且存在字符计数小于k时,调整左指针位置
                while (l < r && (cnt[0] < k || cnt[1] < k || cnt[2] < k)) {
                    // 将左指针指向的字符计数加回
                    cnt[s.charAt(l) - 'a']++;
                    // 左指针右移
                    l++;
                }

                // 如果满足每个字符至少出现k次的条件,更新答案
                if (cnt[0] >= k && cnt[1] >= k && cnt[2] >= k) {
                    ans = Math.min(ans, len - (r - l + 1));
                }
            }

            // 返回最终答案
            return ans;
        }
    }

标签:字符,每种,int,cnt,++,ans,2516,指针
From: https://www.cnblogs.com/java-cheng/p/18438979

相关文章

  • 【C语言】字符函数和字符串函数(1)
    文章目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现四、strcpy的使用和模拟实现五、strcat的使用和模拟实现六、strcmp的使用和模拟实现一、字符分类函数  C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的,这些......
  • 【CTF Web】BUUCTF SQLi-LABS Page-1(Basic Challenges) Less-12 Writeup(SQL注入+POST
    sqli-labs1点击启动靶机。SQLi-LABSPage-1(BasicChallenges)解法随便提交一些数据。审查元素。<formaction=""name="form1"method="post"> <divstyle="margin-top:15px;height:30px;">Username:&nbsp;&nbsp;&......
  • java字符串连接和运算符优先级
    源代码:publicclassEnumTest{publicstaticvoidmain(String[]args){intx=100;inty=200;System.out.println("x+y="+y+x+y);System.out.println(x+y+"=x+y");}}程序输出:x+y=200100200300=x......
  • 字符函数和字符串函数
    字符函数和字符串函数字符分类函数大家知道字符是分为很多种类型的就比如说’a’‘1’'A’等等,所以我们需要一种函数来完成字符函数的分类这就是字符分类函数函数需要包含头文件<ctype.h>函数的运行规则是:如果符合下列参数就返回真inscntrl(控制任何字节)isspace(空白......
  • 9041 影子字符
    又开更了描述输入一个只由小写字母组成的字符串,其中有可能会有重复的字符,而我们认为在字符串中重复的字符都是影子字符。例如字符串 "abbc",字符 b 为影子字符。现在要求把字符串中所有的非影子字符都按照字母顺序依次输出。输入描述1行,一个字符串,不包含空格,字符串长度......
  • 字符串的增删改查
    一.增:增加元素方法一:使用"+"/"*"语法格式:"字符串1"+字符串"2"*数值... 注:以下例子以两个元素进行举例,当使用"+"对两个字符串进行拼接时,注意:此时拼接出的新字符串中间是没有空格的.字符串与字符串直接没有"*"这个方法a='李二牛'b='王艳兵'c=a+bprint(c)......
  • Day4 C++(运算符重载,模板与容器)(友元函数,运算符重载,赋值运算符,string字符串类,模板)
    1.友元friend1.1概念(掌握)定义:类实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,仅能通过类的成员函数才能读写。如果数据成员定义为公共的,则又破坏了封装性。但是某些情况下,需要频繁读写类的成员,特别是在对某些成员函数多次调用时,由于参数传递、类型检查和安全......
  • 你还在开发传统单片机?让单片机用上字符设备驱动!
    本文章为作者原创,未经允许严禁转载。在刚开始学习单片机的时候,我就想过,当驱动、功能越来越多了应该怎么管理。不同的设备需要不同的函数进行操作,在刚开始我还不太会设计软件架构,当设备功能的数量达到数十个时,代码维护难度就达到了灾难级别。在读大二后,我开始使用freertos并搭配st......
  • APP逆向实战:喜马拉雅(OLLVM混淆,字符串加密)
    喜马拉雅抓包:POST/mobile/login/pwd/v3HTTP/1.1Cookie:1&_device=android&fcecf4c4-5ddc-30e3-86b1-6e675f92bfd0&6.6.99;channel=and-f5;impl=com.ximalaya.ting.android;osversion=29;fp=009527657x2022q22564v0500000000000000000000000000000000000000;devic......
  • rust-BufReader逐字符读取
    BufReader有一个fill_buf的方法:fnfill_buf(&mutself)->Result<&[u8]>它可以返回它的内部buffer,如果buffer是空的,就填入更多数据再返回。这样我们就可以逐个读取其内部buffer的字符,且不需要额外申请空间了。通过fill_buf返回的buffer处理完了一些数据之后,可以通过consume来......