G-eli和字符串

题目描述
eli拿到了一个仅由小写字母组成的字符串。
她想截取一段连续子串,这个子串包含至少 kkkkkkkkk 个相同的某个字母
她想知道,子串的长度最小值是多少?
注:所谓连续子串,指字符串删除头部和尾部的部分字符(也可以不删除)剩下的字符串。例如:对于字符串“arcaea”而言,“arc”、“rcae”都是其子串。而“car”、“aa”则不是它的子串。
输入描述:
第一行输入两个正整数 nnnnnnnnn 和 kkkkkkkkk(1≤k≤n≤2000001≤k≤n≤2000001≤k≤n≤2000001≤k≤n≤2000001 \le k \le n \le 2000001≤k≤n≤2000001≤k≤n≤2000001≤k≤n≤2000001≤k≤n≤200000)
输入仅有一行,为一个长度为 nnnnnnnnn 的、仅由小写字母组成的字符串。
输出描述:
如果无论怎么取都无法满足条件,输出 −1−1−1−1-1−1−1−1−1 。
否则输出一个正整数,为满足条件的子串长度最小值。

示例1
5 2
abeba

3
说明:选择“beb”子串,长度为3,其中包含相同的两个’b’

思路如下

方法类似于“尺取法”,也可以认为是尺取法 或 双针法,其实大致思路都一样,只不过是实现的方法不一样,,,它们的主要思路是:

  1. 先找到一个符合题意的区间,在这一题中就是 含有 k 个相同字母的区间。
  2. 之后在 保证这个区间符合题意的基础上不断缩小区间范围,去找到更短的区间 的答案,当该区间在缩小完之后 不符和题意了,那么在扩大这个区间,使该区间在此符合题意,此时再次进行 2 这一步操作

题解一(尺取法?)

#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
const int Len = 200005;
int barrel[Len];
char ar[Len];int main()
{//freopen("T.txt","r",stdin);map<char , int> mp;int n,k;cin >> n >> k >> ar;int l = -1, r = -1;//尺取 找到一个合适的区间for(int i = 0; i < n; i ++){mp[ar[i]] ++;if(mp[ar[i]] == k){r = i;break;}}if(r == -1){cout<< -1 << endl;return 0;}//不断缩紧、扩大区间int len = 1e9;while(l < r && l < n - k && r < n){while(mp[ar[r]] == k && l < r){len = min(len , r - l);l ++;mp[ar[l]] --;}r ++;if(r == n) break;mp[ar[r]] ++;}if(len == 1e9)cout<<-1<<endl;elsecout<<len<<endl;return 0;
}

题解如下(双针法? 前缀和?)

#include<iostream>
#include<string>
using namespace std;
const int Len = 2e5 + 5;
int dp[Len][26];int main()
{int n,k;string s;cin >> n >> k >> s;dp[0][s[0] - 'a'] = 1;for(int i = 1; i < n; i ++){for(int j = 0; j < 26; j ++){dp[i][j] = dp[i - 1][j];}dp[i][s[i] - 'a'] ++;}//先找到一个合适的区间int min_len = 1e9;for(int i = 0; i < 26; i ++){int l = 0,r = 0;if(dp[n - 1][i] < k) continue;while(l < n && dp[l][i] == 0) l ++;while(r < n && dp[r][i] < k)  r ++;min_len = min(min_len , r - l  + 1);//对区间不断 扩大缩小范围for(l ++; l < n; l ++){if(s[l - 1] - 'a' == i){r ++;while(r < n && s[r] - 'a' != i) r ++;if(r == n)  break;}min_len = min(min_len , r - l  + 1);}}if(min_len != 1e9)cout << min_len << endl;elsecout << -1 << endl;return 0;
}

牛客寒假基础集训营 | Day1 G-eli和字符串相关推荐

  1. 牛客寒假基础集训营 | Day1 D题—hanayo和米饭

    一. 题目描述 hanayo很喜欢吃米饭. 有一天,她拿出了 个碗,第一个碗装了 1 粒米饭,第二个碗装了 2 粒米饭,以此类推,第 n 个碗装了 n 粒米饭. 然而,爱搞恶作剧的rin把所有的碗的顺 ...

  2. 牛客寒假基础集训营 | Day1 E题—rin和快速迭代

    一. 题目描述 二. 测试用例 三. 代码 #include <iostream> using namespace std; #include <math.h>long lon ...

  3. 小a与204(牛客寒假算法集训营1题目B)

    链接:https://ac.nowcoder.com/acm/contest/317/B 来源:牛客网 时间限制:C/C++ 1秒, 其他语言2秒 空间限制: C/C++ 262144K,其他语言52 ...

  4. 2023牛客寒假算法集训营3

    (数学场真折磨人) A. 不断减损的时间(贪心) 题意: 给定一个数组,任意次操作,每次操作可以 选择一个偶数除以 222 . 求最终数组所有元素之和的最小值. 思路: 要使得所有元素之和最小,那肯定 ...

  5. 笔记②:牛客校招冲刺集训营---C++工程师(面向对象(友元、运算符重载、继承、多态) -- 内存管理 -- 名称空间、模板(类模板/函数模板) -- STL)

    0618 C++工程师 第5章 高频考点与真题精讲 5.1 指针 & 5.2 函数 5.3 面向对象(和5.4.5.5共三次直播课) 5.3.1 - 5.3.11 5.3.12-14 友元 友 ...

  6. 笔记③:牛客校招冲刺集训营---C++工程师(5.9 C++新特性)

    0625 C++工程师 第5章 高频考点与真题精讲 5.1 指针 & 5.2 函数 5.3 面向对象(和5.4.5.5共三次直播课) 5.3.1 - 5.3.11 5.3.12-38 5.6 ...

  7. 2021牛客OI赛前集训营-提高组(第四场) T2空间跳跃

    2021牛客OI赛前集训营-提高组(第四场) 题目大意 给你三个整数 n , d , l n,d,l n,d,l, n n n为正整数.负整数或0, d , l d,l d,l为正整数,你现在有一个数 ...

  8. 2020牛客NOIP赛前集训营-普及组第三场C牛半仙的妹子树

    链接:https://ac.nowcoder.com/acm/contest/7608/C 来源:牛客网 牛半仙有 n​ 个妹子,她们所在的位置组成一棵树,相邻两个妹子的距离为 1​. 有 m​ 个妹 ...

  9. 牛客寒假基础训练营1

    文章目录 前言 九小时九个人九扇门 炸鸡块君与FIFA22 Baby's first attempt on CPU 牛牛做数论 炸鸡块君的高中回忆 中位数切分 ACM is all you need ...

  10. 2020牛客NOIP赛前集训营-提高组(第一场) T2 牛牛的猜球游戏

    题目链接: 牛客原站 通过记录: 题目链接2:T277380 牛牛的猜球游戏(被我们搬到洛谷力): 洛谷搬运 题目描述   有十个数 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ...

最新文章

  1. javascript遍历DOM结构和对象结构
  2. Elasticsearch的或且非及其组合
  3. DELETE ADJACENT DUPLICATES FROM语句的深入研究及应用
  4. android 消息列表,[Android]用LinearLayout 实现类微信消息列表项
  5. QT中生成字符串md5的方法
  6. 华为云该网站服务器错了,云服务器选错镜像版本
  7. 评人工智能如何走向新阶段?
  8. 练习1,从文件到数据库
  9. linux类似everything的软件,安装linux下强大的文件工具fsearch,与windows下Everything类似...
  10. 计算机无法搜索到打印机驱动,教你一招解决电脑无法找到打印机驱动程序包要求的核心驱动的问题 - 驱动管家...
  11. Mybatis使用choose when
  12. 中文不能输入超过20,英文输入不能超过40个
  13. h5 invoke android,uniapp安卓版本11.0.0以上真机调试App: onLaunch have been invoked
  14. python版本切换 for Windows(Anaconda) Linux(pyenv)
  15. 初识Calcite——使用实例
  16. php禁用函数设置及查看方法详解
  17. 第一性原理(DFT)基础知识
  18. linux 进程间通信 数据库,什么是进程间通信
  19. workbench设置单元坐标系_节点坐标系:很多Workbench结构用户不知道的重要概念
  20. Flutter 2.10 现已发布

热门文章

  1. The choise between Interface and Abstract Class
  2. python下载安装图文教程-Pycharm下载安装图文教程
  3. [UVA 202]Repeating Decimals
  4. 麻吉宝创世内测开启,阿里区块链邀请码AP751K
  5. 2015070610 - 看到很多所谓的大牛
  6. 同样是学编程,为什么别人十几岁就成了黑客,而你还在做码农
  7. 陕西计算机中考考试,2018年陕西省中考考试时间及科目安排公布
  8. java多态理解通俗,说说 Java 多态那些事儿~
  9. Qt常用类的一些介绍
  10. 谷歌浏览器能打开网页微信_Chrome浏览器打开微信页面-Go语言中文社区