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;
else
cout<<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;
else
cout << -1 << endl; return 0;
}

牛客寒假基础集训营 | Day1 G-eli和字符串的更多相关文章

  1. 牛客寒假基础集训营 | Day1 J题—u's的影响力(水题)

    Day1 J题-u's的影响力 有一天,kotori发现了一个和lovelive相似的游戏:bangdream.令她惊讶的是,这个游戏和lovelive居然是同一个公司出的! kotori经过一段时间 ...

  2. 牛客寒假基础集训营 | Day1 E-rin和快速迭代(暴力 + 优化)

    E-rin和快速迭代 题目描述 rin最近喜欢上了数论. 然而数论实在太复杂了,她只能研究一些简单的问题. 这天,她在研究正整数因子个数的时候,想到了一个"快速迭代"算法.设 f( ...

  3. 牛客寒假基础集训营 | Day1 D-hanayo和米饭

    D-hanayo和米饭 题目描述 hanayo很喜欢吃米饭. 有一天,她拿出了 nnnnnnnnn 个碗,第一个碗装了 111111111 粒米饭,第二个碗装了 222222222 粒米饭,以此类推, ...

  4. 牛客寒假算法基础集训营4 G Applese 的毒气炸弹

    链接:https://ac.nowcoder.com/acm/contest/330/G来源:牛客网 众所周知,Applese 是个很强的选手,它的化学一定很好. 今天他又AK了一套题觉得很无聊,于是 ...

  5. 牛客noip前集训营(第一场)提高T1

    链接:https://www.nowcoder.com/acm/contest/172/A来源:牛客网 题目描述 小N得到了一个非常神奇的序列A.这个序列长度为N,下标从1开始.A的一个子区间对应一个 ...

  6. 2020牛客NOIP赛前集训营-普及组(第二场)A-面试

    面 试 面试 面试 题目描述 牛牛内推了好多人去牛客网参加面试,面试总共分四轮,每轮的面试官都会对面试者的发挥进行评分.评分有 A B C D 四种.如果面试者在四轮中有一次发挥被评为 D,或者两次发 ...

  7. 2020牛客NOIP赛前集训营-普及组(第二场) 题解

    目录 T1 面试 描述 题目描述 输入描述: 输出描述: 题解 代码 T2 纸牌游戏 描述 题目描述 输入描述: 输出描述: 题解 代码 T3 涨薪 描述 题目描述 输入描述: 输出描述: 题解 代码 ...

  8. 2020牛客寒假算法基础集训营5 G街机争霸

    题目描述 哎,又是银首,要是你这个签到题少WA一发就金了 牛牛战队的队员打完比赛以后又到了日常甩锅的时间.他们心情悲伤,吃完晚饭以后,大家相约到一个街机厅去solo.牛牛和牛能进入了一个迷宫,这个迷宫 ...

  9. 2020牛客寒假算法基础集训营3 G.牛牛的Link Power II (树状数组维护前缀和)

    https://ac.nowcoder.com/acm/contest/3004/G 发现每个“1”对于它本身位置产生的影响贡献为0,对前面的“1”有产生贡献,对后面的"1"也产生 ...

随机推荐

  1. idea创建简单web项目分析Servlet的请求转发与重定向的区别

     注:如需转载,请附上原文链接,如有建议或意见,欢迎批评指正! 需求说明: // index.jsp页面 1 <% 2 String basePath = request.getScheme() ...

  2. 织梦cms文章内容页上下篇单独获得URL和文章名称修改

    1.打开/include/arc.archives.class.php ,查找   $this->PreNext['pre']    //约813行 在其下一行插入: $this->Pre ...

  3. PHP变量存储结构

    首先声明,我并没有去读PHP的源码,只是对于PHP的有时候诡异的表现感兴趣,找了一下开发人员laruence的博客结合PHP提供的函数debug_zval_dump刺探得到了本博客所阐述的工作机理.如 ...

  4. Django _web框架本质

    Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. socket服务端 import  ...

  5. 【python】定时锁屏,保护身体

    前言 最近越来越懒,一上班坐到电脑前就不愿意动,不喝水也不起来走动,一下班离开电脑就头晕眼花.想起前两年被肾结石支配的恐惧o(╥﹏╥)o,,,还是写个小工具强制自己喝水防止复发吧.VS Code启动 ...

  6. 把 GitHub 放入口袋,“开箱”官方客户端

    GitHub 2019 开发者大会说要出的客户端,今天(2020.3.18)终于放出了下载.之前如果登记过的小伙伴应该也和我一样收到了下面样子的邮件: 好了,那么接下来我们就来"开箱&quo ...

  7. failed to open directory

    解决方法: 解决方案的路径不要包含中文!

  8. [日志分析]Graylog2进阶 通过正则解析Nginx日志

    之前分享的 [日志分析]Graylog2采集Nginx日志 主动方式 这篇文章介绍了Graylog如何通过Graylog Collector Sidecar来采集nginx日志. 由于日志是未经处理的 ...

  9. [日志分析]Graylog2采集Nginx日志 主动方式

    这次聊一下Graylog如何主动采集Nginx日志,分成两部分: 介绍一下 Graylog Collector Sidecar 是什么 如何配置 Graylog Collector Sidecar 采 ...

  10. Altium Designer 20下载与安装教程

    目录 一.Altium Designer 20下载 二.Altium Designer 20安装 三.Altium Designer 20破解 四.Altium Designer 20汉化 作者:st ...