当前位置: 首页> 教育> 锐评 > 福建疫情最新数据消息_石家庄网页制作_谷歌网页版入口在线_在什么网站可以免费

福建疫情最新数据消息_石家庄网页制作_谷歌网页版入口在线_在什么网站可以免费

时间:2025/8/26 5:02:17来源:https://blog.csdn.net/qq_40052678/article/details/142586358 浏览次数:0次
福建疫情最新数据消息_石家庄网页制作_谷歌网页版入口在线_在什么网站可以免费

2516. 每种字符至少取 K 个

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

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

数据范围

  • 1 <= s.length <= 105
  • s 仅由字母 'a''b''c' 组成
  • 0 <= k <= s.length

分析

本题有良好的二分性质,对于某一个 t t t,小于 t t t的分钟都无法满足,大于等于t的都可以满足,因此可以考虑二分答案

代码

class Solution {
public:const static int N = 1e5 + 5;int prea[N], preb[N], prec[N];int lasta[N], lastb[N], lastc[N];int n;bool check(int t, int k) {for(int i = 0; i <= t; i ++ ) {int na = prea[i] + lasta[n - (t - i) + 1];int nb = preb[i] + lastb[n - (t - i) + 1];int nc = prec[i] + lastc[n - (t - i) + 1];if(na >= k && nb >= k && nc >= k) return true;}return false;}int find(int l, int r, int k) {while(l < r) {int mid = (l + r) >> 1;if(check(mid, k)) r = mid;else l = mid + 1;}return l;}int takeCharacters(string s, int k) {n = s.size();for(int i = 1; i <= n; i ++ ) {prea[i] = prea[i - 1] + (s[i  - 1] == 'a' ? 1 : 0);preb[i] = preb[i - 1] + (s[i  - 1] == 'b' ? 1 : 0);prec[i] = prec[i - 1] + (s[i  - 1] == 'c' ? 1 : 0);}for(int i = n; i >= 1; i -- ) {lasta[i] = lasta[i + 1] + (s[i - 1] == 'a' ? 1 : 0);lastb[i] = lastb[i + 1] + (s[i - 1] == 'b' ? 1 : 0);lastc[i] = lastc[i + 1] + (s[i - 1] == 'c' ? 1 : 0);}if(prea[n] < k || preb[n] < k || prec[n] < k) return -1;int l = 0, r = n;int res = find(0, n, k);return res;}
};

关键字:福建疫情最新数据消息_石家庄网页制作_谷歌网页版入口在线_在什么网站可以免费

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: