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

2516. 每种字符至少取 K 个

时间:2023-04-02 16:57:18浏览次数:41  
标签:字符 每种 int arr len needA needC 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 <= s.length <= 10^5
  • s 仅由字母 'a''b''c' 组成
  • 0 <= k <= s.length
 1 class Solution {
 2     public int takeCharacters(String s, int k) {
 3         int len = s.length();
 4         if (len < 3 * k)
 5             return -1;
 6         int[] arr = new int[3];
 7         char[] cs = s.toCharArray();
 8         for (char c : cs) {
 9             arr[c - 'a']++;
10         }
11         //needA、needB、needC是剩下的a,b,c的个数,即中间的最长连续子序列需要的个数。
12         int needA = arr[0] - k;
13         int needB = arr[1] - k;
14         int needC = arr[2] - k;
15         if (needA == 0 && needB == 0 && needC == 0)
16             return len;
17         if (needA < 0 || needB < 0 || needC < 0)
18             return -1;
19         //至此将原题转化为求中间剩下的最长连续子序列的长度是多少,最后用总长度减去即为解。
20         arr = new int[3];
21         int left = 0, right = 0;
22         int maxLen = 0;
23         while (right < len) {
24             char r = cs[right];
25             right++;
26             arr[r - 'a']++;
27             while (arr[0] > needA || arr[1] > needB || arr[2] > needC) {
28                 char l = cs[left];
29                 left++;
30                 arr[l - 'a']--;
31             }
32             maxLen = Math.max(maxLen, right - left);
33         }
34         return len - maxLen;
35     }
36 }

 

标签:字符,每种,int,arr,len,needA,needC,2516
From: https://www.cnblogs.com/Co3y/p/17280740.html

相关文章

  • [oeasy]python0123_中文字符_文字编码_gb2312_激光照排技术_王选
    中文编码GB2312回忆上次内容上次回顾了日韩各有编码格式日本有假名五十音一字节可以勉强放下 有日本汉字字符数量超过20000+  韩国有谚文数量超过500一个字节放不下 有朝鲜汉字字符数量超过20000+......
  • 字符编码介绍
    字符编码是用于将字符集中的字符转换为二进制数据的方式。以下是常见的字符编码:ASCII编码:AmericanStandardCodeforInformationInterchange(美国信息交换标准代码),它使用7位二进制数来表示128个字符,ASCII编码最早用于电报通信,包括大小写字母、数字和一些特殊字符。ASCII编码......
  • 提取横杠以左的字符串
    问题:一列数据中,提取最右一个横杠以左的字符。 数据规律是,A列字符串长度为15位或16位,横杠以右都是7位。函数公式解决:=IF(LEN(A2)=15,LEFT(A2,7),LEFT(A2,8))=LEFT(A2,FIND("-",A2,8)-1)=LEFT(A2,LEN(A2)-8)公式1:先用IF判断,A2的长度为15时,左取7位,否则左取8位。公式2:FI......
  • 字符串(提高组)详解
    字符串(提高组)详解前提提要:本文为提高组字符串,不涉及到后缀科技等相关算法,请放心食用Part1.字符串Hash题目概要如题,给定\(N\)个字符串(第\(i\)个字符串长度为\(M_i\),字符串内包含数字、大小写字母,大小写敏感),请求出\(N\)个字符串中共有多少个不同的字符串。输入格式......
  • day11| 20.有效的括号;150.逆波兰表达式求值;1047.删除字符串中的所有相邻重复项
    20.有效的括号 题目简述:给定一个只包括'(',')','{','}','[',']' 的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。 思路:1.利用一个栈实现2.构建一个字典,键......
  • HJ66 配置文件恢复_字典_字符串
    思路:1、把命令和执行对录入一字串字典和二字串字典2、取字典的可以与输入对比3、为了保证唯一性,用c常数增加1来判断是否唯一。4、最后根据c值统一打印输出1importsys2a=[]3forlineinsys.stdin:4a.append(line.strip().split())5#print(a)6d1={"rese......
  • 字符串、列表、元组、集合
    一、字符串1、定义使用引号(单引号、双引号、三引号)引起来的内容,就是字符串。2、例子#1、单引号str1='abc'#2、双引号str2="abc"#3、三引号str3='''abc'''#4、定义字符串,#字符串本身包含单引号,定义的时候不能使用单引号。字符串本身包含双引号......
  • [oeasy]python0122_日韩字符_日文假名_JIS_Shift_韩国谚文
    日文假名和韩国谚文回忆上次内容上次回顾了非ascii的拉丁字符编码的进化过程0-127是ascii的领域 世界各地编码分布拉丁字符扩展ascii共16种由iso组织制定从iso-8859-1到iso-8859-16 无法同时显示俄文和法文  此......
  • [oeasy]python0122_日韩字符_日文假名_JIS_Shift_韩国谚文
    日文假名和韩国谚文回忆上次内容上次回顾了非ascii的拉丁字符编码的进化过程0-127是ascii的领域世界各地编码分布拉丁字符扩展ascii共16种由iso组织制定从iso-8859-1到iso-8859-16无法同时显示俄文和法文此时中日韩的文字也需要进入计算机象形文字的字符集超级巨大日本......
  • HJ65 查找两个字符串a,b中的最长公共子串_穷举查找字符串相同子串
    思路:1、穷举查找字符串子串2、把相同子串存入数组3、生成新数组存储对应index的子串长度4、返回第一个最长数组index,通过index查找子串输出。1importsys2s1=sys.stdin.readline().strip()3s2=sys.stdin.readline().strip()4iflen(s2)<len(s1):5temp=s1......